动态列表出现意外行为
本文关键字:意外 列表 动态 | 更新日期: 2023-09-27 18:26:40
下面在最后一行抛出运行时异常:
dynamic dynamicCollection = new List<ExpandoObject>();
dynamic itemOne = new ExpandoObject();
itemOne.Name = "itemOne";
dynamicCollection.Add(itemOne);
dynamic itemTwo = new ExpandoObject();
itemTwo.Name = "itemTwo";
dynamicCollection.Add(itemTwo);
var firstItem = dynamicCollection.First();
'System.Collections.Generic.List<System.Dynamic.ExpandoObject>'不包含"第一个"的定义
这里发生了什么?这看起来完全合法。它显然被认为是List<ExpandoObject>
,泛型集合不应该关心T
的值。。正确的
First()
方法是位于System.Linq.Enumerable
而非System.Collections.Generic.List<T>
中的扩展方法。这意味着在运行时查找成员的dyanmic
对象无法解析.First()
的含义,因为如上所述,List<T>
不包含该方法。这里的大问题是,它正在寻找一个成员,并且在解决时不检查扩展方法。
在句法上,你可以说List<T>.First()
,因为它是句法糖。您也可以引用full方法,并且必须使此代码工作,因为dynamic
对象不检查扩展方法。
Enumerable.First(dyanmicCollection);
在编译时,这就是扩展方法有效扩展到的地方,所以基本上绕过了sugar,
您真的需要dynamicCollection
成为dynamic
吗?如果没有,您可以使用列表本身的具体类型:
var dynamicCollection = new List<ExpandoObject>();
...
dynamic firstItem = dynamicCollection.First();
Console.WriteLine(firstItem.Name);
然后CCD_ 13将被解析为您所期望的扩展方法调用。此方法的返回类型为ExpandoObject
,所以您还应该将其强制转换为dynamic
以访问Name
属性。