【发布时间】:2011-08-21 22:47:49
【问题描述】:
是否可以指定运算符R,其中R 可以是算术、关系或逻辑运算符?
例如一个计算函数
c = a R b
我可以在哪里指定R 是否为+, -, *, /
这可以在 C# 中完成吗?
【问题讨论】:
-
是的,这是可能的,但最通用的方法是了解Expression Trees。 :) 将如何确定要使用的运算符?
是否可以指定运算符R,其中R 可以是算术、关系或逻辑运算符?
例如一个计算函数
c = a R b
我可以在哪里指定R 是否为+, -, *, /
这可以在 C# 中完成吗?
【问题讨论】:
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);
【讨论】:
你可以用 lambda 做一些非常接近的事情:
Func<int, int, int> op = (x, y) => x + y; // or any other operator
然后像任何其他委托一样使用它:
int result = op(1, 2);
如果有问题的类型是用户使用重载运算符定义的,您可以使用反射,但恐怕对于 int 这样的类型是不可能的。
【讨论】:
【讨论】:
在 C# 中可能存在运算符重载,请查看一些 MSDN
http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx
【讨论】: