【发布时间】:2011-02-06 13:55:05
【问题描述】:
首先是错误信息
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:“System.Collections.Generic.List”不包含“First”的定义 在 CallSite.Target(闭包,CallSite,对象) 在 System.Dynamic.UpdateDelegates.UpdateAndExecute1(CallSite 站点,T0 arg0) 在 ToPropertyDictionaryTests.cs 中的 ClaySharp.Tests.ToPropertyDictionaryTests.TestExpando():第 91 行
测试:
[测试]
public void TestExpando()
{
dynamic root = new ExpandoObject();
root.Name = "Name";
var result = GetExpandos();
root.Child = result;
var first = root.Child.First();
Assert.That(first.Name, Is.EqualTo("Obj1"));
}
private IEnumerable<dynamic> GetExpandos()
{
var toReturn = new List<dynamic>();
dynamic obj1 = new ExpandoObject();
toReturn.Add(obj1);
obj1.Name = "Obj1";
dynamic obj2 = new ExpandoObject();
toReturn.Add(obj2);
obj2.Name = "Obj2";
return toReturn;
}
有趣的是,如果从图片中删除“root”,并针对“结果”执行测试,则它可以正常工作。
现在是非常奇怪的部分。调试是在“toReturn”返回之前的设置点。看看这个,它有效
?toReturn.GetType().FullName
“System.Collections.Generic.List`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]”
?返回
计数 = 2 [0]: {System.Dynamic.ExpandoObject} [1]:{System.Dynamic.ExpandoObject}
?toReturn.First()
{System.Dynamic.ExpandoObject}
在它被分配给“root”之前,仍然有效
?结果
计数 = 2 [0]: {System.Dynamic.ExpandoObject} [1]:{System.Dynamic.ExpandoObject}
?result.First()
{System.Dynamic.ExpandoObject}
但是在分配给root之后就失败了
?root.Child
{System.Collections.Generic.List} [0]: {System.Dynamic.ExpandoObject} [1]:{System.Dynamic.ExpandoObject}
?root.Child.First()
【问题讨论】: