以编程方式指定运算符

时间:2011-05-09 19:41:54

标签: c# operators

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

例如计算

的函数
c = a R b

我可以指定R+, -, *, /

可以在C#中完成吗?

4 个答案:

答案 0 :(得分:7)

binary operator是接受两个操作数的任何函数。使用delegates抽象此功能很简单,它基本上是方法(函数)的包装。

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

public Tout GetResult<TIn, TOut>(TIn a, TIn b, Func<TIn, TIn, TOut> @operator)
{
     return @operator(a, b);
}

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

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

private int Subtract(int a, int b)
{
     return a - b;
}

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

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

// use the "Subtract" operator
int difference = GetResult(10, 10, Subtract);

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

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

答案 1 :(得分:2)

你可以使用lambda做一些非常接近的事情:

Func<int, int, int> op = (x, y) => x + y; // or any other operator

然后像任何其他代表一样使用它:

int result = op(1, 2);

如果有问题的类型是用户定义的重载运算符,你可以使用反射,但我担心像int这样的类型是不可能的。

答案 2 :(得分:0)

答案 3 :(得分:-3)

可以在C#中进行运​​算符重载,检查一些MSDN

http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx