我正在尝试使用包含匿名类型的动态变量。例如:
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:“对象”不包含“法语”的定义
显然, xa 没有正确的类型?如果我引入一个命名类,翻译,并将第一行更改为
var hello = new Translate {french = "bonjour"};
它按预期工作。如果我通过替换第 2 行和第 3 行来替换 make x 和 hello 匿名,它也可以工作
var x = new { a = hello };
或者如果我让 x 和 hello 都动态化。
如果我使 x 匿名和 hello 动态,它也会失败:
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]"));