2011-05-09 102 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這樣的類型是不可能的。