如何在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

如果可以的话,我宁愿不这样做,因为这个方法只在一个地方调用,创建一个一次性对象似乎有些过头了。

您需要显式调用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>的答案。

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

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

if (!Segments.Any()) 
{
}

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

尝试Linq count using System.Linq; Segments.count()

您也可以使用属性Length!

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

相关内容

  • 没有找到相关文章

最新更新