C#4表达式树中的"动态"

Pav*_*aev 49 c# dynamic expression-trees c#-4.0

我正在试图弄清楚如何将所有部分组合在一起,并希望从一个简单的案例开始的具体源代码示例.

考虑以下C#代码:

Func<int, int, int> f = (x, y) => x + y;
Run Code Online (Sandbox Code Playgroud)

我可以使用表达式树在运行时生成等效函数,如下所示:

var x = Expression.Parameter(typeof(int), "x");
var y = Expression.Parameter(typeof(int), "y");
Func<int, int, int> f =
    Expression.Lambda<Func<int, int, int>>(
        Expression.Add(x, y),
        new[] { x, y }
    ).Compile();
Run Code Online (Sandbox Code Playgroud)

现在给出以下lambda:

Func<dynamic, dynamic, dynamic> f = (x, y) => x + y;
Run Code Online (Sandbox Code Playgroud)

如何使用表达式树(并且,大概Expression.Dynamic)生成等效的?

Qua*_*ter 54

您可以通过将动态C#添加表达式的CallSiteBinder传递给Expression.Dynamic来创建表示动态C#添加表达式的表达式树.您可以通过在原始动态表达式上运行Reflector来发现创建Binder的代码.你的例子会是这样的:

var x = Expression.Parameter(typeof(object), "x");
var y = Expression.Parameter(typeof(object), "y");
var binder = Binder.BinaryOperation(
    CSharpBinderFlags.None, ExpressionType.Add, typeof(Program),
    new CSharpArgumentInfo[] { 
        CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), 
        CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)});
Func<dynamic, dynamic, dynamic> f =
    Expression.Lambda<Func<object, object, object>>(
        Expression.Dynamic(binder, typeof(object), x, y),
        new[] { x, y }
    ).Compile();
Run Code Online (Sandbox Code Playgroud)