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

时间:2011-06-08 21:36:01

标签: c# reflection dynamic c#-4.0 anonymous-types

我有一个follow方法,它返回一个表示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;
    }

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

        dynamic Segments = Top20Controller.GetReportFilesbyStoreProductID(StoreProductID");

        if (Segments.Count == 0)  // <== Fails because object doesn't contain count.
        {
            ...
        }
  • dynamic关键字如何运作?
  • 如何访问Count匿名类型的IEnumerable属性?
  • 有没有办法可以使用这种匿名类型,或者我是否必须创建自定义对象,以便我可以传回强类型IEnumerable<myObject>而不是dynamic

如果可以,我宁愿不这样做,因为这个方法只在一个地方被调用,而且创建一个抛弃对象看起来有些过分。

5 个答案:

答案 0 :(得分:20)

您需要显式调用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

有关动态类型不支持扩展方法的原因的讨论,请参阅Extension method and dynamic object in c#

(“d”前缀仅用于示例代码 - 请不要使用匈牙利表示法!)

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

答案 1 :(得分:5)

从该方法返回的IEnumerable<T>没有Count属性,所以我不知道你在说什么。也许您忘记在最后编写ToList()以将其重新列入列表,或者您打算在Count()上调用IEnumerable<T>方法?

答案 2 :(得分:1)

Count()需要枚举以完成收集,您可能需要:

if (!Segments.Any()) 
{
}

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

答案 3 :(得分:0)

尝试使用Linq计数using System.Linq; Segments.Count()

答案 4 :(得分:0)

您也可以使用属性Length !!

if (!Segments.Length)
{
    `enter code here`
}