我正在尝试使用包含匿名类型的动态变量。例如:
var hello = new { french = "bonjour" };
// alternative, dynamic hello
// var hello = new ExpandoObject();
// hello.french = hello
dynamic x = new ExpandoObject();
x.a = hello;
// alternative, anonymous x
// var x = new { a = hello };
Assert.AreEqual("bonjour", x.a.french); // Sanity check - never fails
var interpreter = new Interpreter();
interpreter.SetVariable("x", x);
var result = interpreter.Eval<string>("x.a.french"); // fails
Assert.AreEqual("bonjour", result);
但是,我得到了错误
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:'对象'确实 不包含“法语”的定义
因此,显然x.a没有正确的类型? 如果我引入一个命名类,请翻译,并将第一行更改为
var hello = new Translate {french = "bonjour"};
它按预期工作。如果我将第2行和第3行替换为
,则同时使x和hello匿名,也可以使用var x = new { a = hello };
或者如果我同时使x和hello动态。
如果我将x设为匿名并且问候语是动态的,它也会失败:
dynamic hello = new ExpandoObject();
hello.french = "bonjour";
var x = new { a = hello} ;
在这里,我得到了错误
DynamicExpresso.Exceptions.ParseException:没有属性或字段 类型“对象”中存在“法语”
有什么办法可以使我的第一个代码示例正常工作?在现实生活中,我正在尝试一些更复杂的事情。
我在尝试访问数组时也遇到问题:
dynamic dyn = new ExpandoObject();
dyn.Foo = new int[] {42};
var interpreter = new Interpreter()
.SetVariable("dyn", (object)dyn);
Assert.AreEqual(dyn.Foo[0], interpreter.Eval("dyn.Foo[0]"));