【发布时间】:2011-09-11 06:00:40
【问题描述】:
我有以下方法,它返回一个表示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。为此目的使用动态会消除静态类型的所有优势。 -
@Chevex,如果 OP 从 public 方法返回这个值,我不明白为什么我们认为它只会被调用一次。
-
@mquander,我完全不同意静态类型即使在一次性情况下也没有优势。如果您建议可以从方法返回匿名类型(作为该类型)会很好,我同意!但你不能。在这种情况下,静态类型仍然无限有用。 (智能感知、编译时安全等)
-
@True,不要争论,但我认为 dynamic 不应该永远用于链接匿名类型。它永远不应该被使用,因为一个人懒得创建一个合适的类型。它应该用于反射、动态调度、COM 或动态脚本。
-
@Chevex,是的,这就是为什么这些是 cmets 而不是答案。 :)
标签: c# reflection dynamic c#-4.0 anonymous-types