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

我有以下方法返回一个代表IEnumerable<'a> ('a =匿名类型)的动态对象:

    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;
    }

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

        dynamic Segments = Top20Controller.GetReportFilesbyStoreProductID(StoreProductID");

        if (Segments.Count == 0)  // <== Fails because object doesn't contain count.
        {
            ...
        }
  • dynamic关键字如何运作?
  • 我如何访问IEnumerable匿名类型的Count属性?
  • 有没有一种方法,我可以使用这种匿名类型,或者我必须创建一个自定义对象,以便我可以传回强类型IEnumerable<myObject>而不是dynamic
  • 如果我可以的话,我宁愿不这样做,因为这种方法只在一个地方被调用,创建一个丢弃对象看起来像是过度杀伤。


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


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

    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
    

    请参阅c#中的扩展方法和动态对象,了解动态类型不支持扩展方法的原因。

    (“d”前缀仅用于示例代码 - 请勿使用匈牙利符号!)

    更新:我个人认为@ Magnus的回答是使用if (!Segments.Any())并返回IEnumerable<dynamic>


    Count()需要枚举完成收集,你可能想要:

    if (!Segments.Any()) 
    {
    }
    

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

    链接地址: http://www.djcxy.com/p/31893.html

    上一篇: How to access count property of a dynamic type in C# 4.0?

    下一篇: Wrapping a COM object/dynamic type in C#