直接派生双除法的委托

问题描述 投票:0回答:1

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;

但是这个更长而且更难看。此外,我担心它在需要高效率的情况下的性能。

有什么方法可以直接从除法操作符创建委托而不需要中介吗?

c# numbers delegates operators
1个回答
0
投票

我不相信你可以直接使用那些隐藏的方法来构造委托。

一个明显的选择是通过反射找到方法并创建相应的委托:

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)。

注意问题:使用数字接口或表达式树很可能会带来性能更高的解决方案 - 如果性能是一个问题,请确保尝试所有方法,因为无论您如何构造委托,它们都会增加开销。

© www.soinside.com 2019 - 2024. All rights reserved.