动态列表出现意外行为

本文关键字:意外 列表 动态 | 更新日期: 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属性。