double
数值类型有一个除法运算符。我可以通过简单地写 x / y
来将一个双精度数除以另一个,其中 x
和 y
都是双精度数。
我的理解是,在计算机中,此操作使用一个名为
double.op_Divison
的函数,该函数将两个双精度数作为输入并返回一个双精度数作为输出。
我想直接从该函数创建一个委托。以下不起作用,它会引发编译器错误:
System.Func<double, double, double> d = double.op_Division;
我总是可以创建一个充当中介的新函数:
System.Func<double, double, double> d = (double x, double y) => x / y;
但是这个更长而且更难看。此外,我担心它在需要高效率的情况下的性能。
有什么方法可以直接从除法操作符创建委托而不需要中介吗?
我不相信你可以直接使用那些隐藏的方法来构造委托。
一个明显的选择是通过反射找到方法并创建相应的委托:
var methodInfo = typeof(System.Single).GetMethods(
BindingFlags.NonPublic | BindingFlags.Static)
.First(x=>x.Name.Contains("op_Division"));
Func<Single, Single, Single> f = (Func<Single, Single, Single>)Delegate.CreateDelegate(
typeof(Func<Single, Single, Single>),
null,
methodInfo
);
Console.WriteLine(f(1f, 2f));
请注意,“op_Division”将具有不同的全名,具体取决于框架的版本 - 最新一次将其放在
IDivisionOperators
接口上而不是直接在类上(可能也需要调整 BindingFlags)。
注意问题:使用数字接口或表达式树很可能会带来性能更高的解决方案 - 如果性能是一个问题,请确保尝试所有方法,因为无论您如何构造委托,它们都会增加开销。