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)