我有一个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
? 如果可以,我宁愿不这样做,因为这个方法只在一个地方被调用,而且创建一个抛弃对象看起来有些过分。
答案 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`
}