1

我正在尝试使用包含匿名类型的动态变量。例如:

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]"));
4

0 回答 0