以编程方式指定运算符

roh*_*t89 11 c# operators

是否可以指定运算符R,其中R可以是算术运算符,关系运算符或逻辑运算符?

例如,计算的函数

c = a R b
Run Code Online (Sandbox Code Playgroud)

在那里我可以指定是否R+, -, *, /

这可以用C#完成吗?

Gro*_*roo 7

二进制运算符是接受两个操作数的任何功能.使用委托来抽象这个功能很简单,委托基本上是方法(函数)的包装器.

为了更清楚,我们可以定义一个泛型方法,它不再使用指定的参数调用委托,并返回其结果:

public Tout GetResult<TIn, TOut>(TIn a, TIn b, Func<TIn, TIn, TOut> @operator)
{
     return @operator(a, b);
}
Run Code Online (Sandbox Code Playgroud)

您可以使用它来传递参数和运算符的任意组合:

private bool AreEqual(int a, int b)
{
     return a.Equals(b);
}

private int Subtract(int a, int b)
{
     return a - b;
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用相同的通用方法执行所需的任何操作:

// use the "AreEqual" operator
bool equal = GetResult(10, 10, AreEqual);

// use the "Subtract" operator
int difference = GetResult(10, 10, Subtract);
Run Code Online (Sandbox Code Playgroud)

使用lambda表达式,您甚至可以通过将其指定为匿名方法来"动态"创建运算符:

// define a "Product" operator as an anonymous method
int product = GetResult(10, 10, (a,b) => a*b);
Run Code Online (Sandbox Code Playgroud)