2011-05-09 141 views
11

是否可以指定运算符R其中R可以是算术运算符,关系运算符还是逻辑运算符?以编程方式指定运算符

例如计算

c = a R b 

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

可以在C#来完成的功能?

+0

是的,这是可能的,但最通用的方法做就意味着学习关于[Expression Trees](http://msdn.microsoft.com/zh-cn/library/bb397951.aspx)。 :)如何确定运营商的使用情况? – 2011-05-09 19:46:09

+2

确切复制http://stackoverflow.com/questions/1528319/operators-as-method-parameters-in-c – mcabral 2011-05-09 19:48:32

回答

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); 
-3

它可能有运营商在C#中超载,查了一些MSDN

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

+5

它听起来不像OP想改变给定操作符的功能 - 听起来像,给定两个操作数,他们希望在运行时选择操作。 – 2011-05-09 19:44:52

+0

他要求指定运算符,不要在类中重载它的行为/结构 – Jimmy 2011-05-09 19:45:48

+0

我认为这是一个很好的答案;它可以用来获得所需的功能。 – 2011-05-10 22:28:55

2

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

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

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

int result = op(1, 2); 

如果问题类型是用户定义了重载操作符,可以使用反射,但恐怕对于像int这样的类型是不可能的。