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>));
这个更可怕,也不适用于原语。
有没有优雅的方法?
解决方案
您可以使用.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);
现在你lambda
已经a + b
准备好编译了:
result = lambda.Compile();
Console.WriteLine(result(5, 2)); // print 7
推荐阅读
- node.js - 包在 npm 列表中可见,但不是必需的
- r - 根据嵌套组中的组事件在数据框中生成新列
- c# - 奇怪的布局问题 MVVM .Net 4.7.2 App 控件消失
- ruby - 如何重构我的词频方法?
- windows - 将 Sublime Text 3 设置为 Windows 10 上的默认 .txt 编辑器
- regular-language - 语言 C={a,b} 上的正则表达式
- python - ValueError:检查目标时出错:预期dense_108有2维,但得到的数组形状为(36020、10、2)
- c++ - 听时 winsock“无效参数”错误
- java - 如何检测文件是否不是 utf-8 编码的?
- ruby - 向 Cosmos 添加额外的 CAN 接口