如何将二进制运算符分配给委托

时间:2019-04-02 11:54:50

标签: c#

如何为代表分配接线员?

int a = 5;
int b = 2;
Func<int, int, int> operation = /* int.operator+ or int.operator- */;
int result = operation(a, b);

我知道这样做的三种方法:

Func<int, int, int> operation = (a, b) => a + b;

此代码包装到另一个函数调用中。

Func<C, C, C> operation = (Func<C, C, C>)typeof(C).GetMethod("op_Addition").CreateDelegate(typeof(Func<C, C, C>));

这是可怕的,不适用于基本体。

Expression<Func<C, C, C>> expression = (c, c2) => c + c2;
BinaryExpression binaryExpression = (BinaryExpression)expression.Body;
MethodInfo binaryExpressionMethod = binaryExpression.Method;
Func<C, C, C> operation = (Func<C, C, C>)binaryExpressionMethod.CreateDelegate(typeof(Func<C, C, C>));

这更可怕,也不适用于基元。

有一种优雅的方法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用.Compile的lambda表达式方法执行此操作:

Func<int, int, int> result;

var a = Expression.Parameter(typeof(int), "a");
var b = Expression.Parameter(typeof(int), "b");
var body = Expression.Add(a, b);
var lambda = Expression.Lambda<Func<int, int, int>>(body, a, b);

现在您的lambdaa + b并可以编译了:

result = lambda.Compile();
Console.WriteLine(result(5, 2)); // print 7