首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C# 4.0中访问动态类型的计数属性?

如何在C# 4.0中访问动态类型的计数属性?
EN

Stack Overflow用户
提问于 2011-06-08 21:36:00
回答 5查看 22.5K关注 0票数 14

下面的方法返回表示IEnumerable<'a> ('a=anonymous类型)的动态对象:

代码语言:javascript
运行
复制
    public dynamic GetReportFilesbyStoreProductID(int StoreProductID)
    {
        Report report = this.repository.GetReportByStoreProductID(StoreProductID);

        if (report == null || report.ReportFiles == null)
        {
            return null;
        }

        var query = from x in report.ReportFiles
                    orderby x.DisplayOrder
                    select new { ID = x.RptFileID, Description = x.LinkDescription, File = x.LinkPath, GroupDescription = x.ReportFileGroup.Description };

        return query;
    }

我希望能够访问这个匿名类型的Count属性。我试图使用以下代码访问上述方法,但它失败了:

代码语言:javascript
运行
复制
        dynamic Segments = Top20Controller.GetReportFilesbyStoreProductID(StoreProductID");

        if (Segments.Count == 0)  // <== Fails because object doesn't contain count.
        {
            ...
        }

  • 关键字如何操作?
  • 如何访问IEnumerable匿名类型的Count属性?
  • 是否有一种方法可以使用此匿名类型,或者是否必须创建一个自定义对象,以便可以传回强类型IEnumerable<myObject>而不是dynamicH 216f 217

如果可以的话,我宁愿不要这样做,因为这个方法只在一个地方调用,而创建一个丢弃对象似乎是过火了。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-06-08 21:38:39

从该方法返回的IEnumerable<T>没有Count属性,所以我不知道您在说什么。也许您忘记在末尾编写ToList(),以便将其具体化为列表,或者您打算在IEnumerable<T>上调用Count()方法。

票数 5
EN

Stack Overflow用户

发布于 2011-06-08 22:09:41

您需要显式地调用Enumerable.Count()。

代码语言:javascript
运行
复制
IEnumerable<string> segments =
  from x in new List<string> { "one", "two" } select x;

Console.WriteLine(segments.Count());  // works

dynamic dSegments = segments;

// Console.WriteLine(dSegments.Count());  // fails

Console.WriteLine(Enumerable.Count(dSegments));  // works

有关为什么动态类型不支持扩展方法的讨论,请参见Extension method and dynamic object in c#

( "d“前缀只是示例代码的前缀--请不要使用匈牙利符号!)

更新:就我个人而言,我将使用使用if (!Segments.Any())@Magnus's answer并返回IEnumerable<dynamic>

票数 27
EN

Stack Overflow用户

发布于 2011-06-08 21:43:19

Count()需要枚举才能完成集合,您可能需要:

代码语言:javascript
运行
复制
if (!Segments.Any()) 
{
}

而您的函数应该返回IEnumerable<object>而不是动态

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6285575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档