如何将动态变量与匿名类型一起使用?

时间:2018-10-29 07:48:05

标签: dynamic-expresso

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

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

0 个答案:

没有答案