Rod*_*ney 13 c# reflection dynamic anonymous-types c#-4.0
我有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;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够访问Count此IEnumerable匿名类型的属性.我正在尝试使用以下代码访问上述方法,但它失败了:
dynamic Segments = Top20Controller.GetReportFilesbyStoreProductID(StoreProductID");
if (Segments.Count == 0) // <== Fails because object doesn't contain count.
{
...
}
Run Code Online (Sandbox Code Playgroud)
dynamic关键字如何运作?Count属性IEnumerable?IEnumerable<myObject>而不是dynamic?我宁愿不这样做,如果我可以,因为这个方法只在一个地方调用,创建一个扔掉的对象似乎有点矫枉过正.
Tru*_*ill 22
您需要显式调用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
Run Code Online (Sandbox Code Playgroud)
有关动态类型不支持扩展方法的原因的讨论,请参阅c#中的扩展方法和动态对象.
("d"前缀仅用于示例代码 - 请不要使用匈牙利表示法!)
更新:就个人而言,我会选择@Magnus使用if (!Segments.Any())和返回的答案IEnumerable<dynamic>.
在IEnumerable<T>这与该方法返回的没有一个Count属性,所以我不知道你在说什么.也许你忘记写ToList()在最后将其重新列入一个列表,或者你打算调用该Count()方法IEnumerable<T>?
| 归档时间: |
|
| 查看次数: |
14501 次 |
| 最近记录: |