x + y; 我可以在运行时使用表达式树生-6ren">
gpt4 book ai didi

C# 4 表达式树中的 "dynamic"

转载 作者:IT王子 更新时间:2023-10-29 03:50:41 26 4
gpt4 key购买 nike

我正在尝试弄清楚如何将所有部分组合在一起,希望能有一个具体的源代码示例作为一个简单案例的开始。

考虑以下 C# 代码:

Func<int, int, int> f = (x, y) => x + y;

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

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();

现在给出以下 lambda:

Func<dynamic, dynamic, dynamic> f = (x, y) => x + y;

我如何使用表达式树(大概还有 Expression.Dynamic)生成等效项?

最佳答案

您可以通过将动态 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();

关于C# 4 表达式树中的 "dynamic",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3562088/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com