回答
一個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);
它可能有運營商在C#中超載,查了一些MSDN
http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx
它聽起來不像OP想改變給定操作符的功能 - 聽起來像,給定兩個操作數,他們希望在運行時選擇操作。 – 2011-05-09 19:44:52
他要求指定運算符,不要在類中重載它的行爲/結構 – Jimmy 2011-05-09 19:45:48
我認爲這是一個很好的答案;它可以用來獲得所需的功能。 – 2011-05-10 22:28:55
你可以做一些非常接近使用lambda:
Func<int, int, int> op = (x, y) => x + y; // or any other operator
,然後使用它像任何其他代表:
int result = op(1, 2);
如果問題類型是用戶定義了重載操作符,可以使用反射,但恐怕對於像int
這樣的類型是不可能的。
- 1. 以編程方式指定資源ID
- 2. 以編程方式指定Fogbugz案例
- 3. 以編程方式指定unicode字符R
- 4. 以編程方式鎖定Iphone以編程方式
- 5. 以編程方式計算的曲線?
- 6. 以編程方式插入指令角
- 7. 以編程方式指定字符串格式化float的小數精度
- 8. 以編程方式爲HeaderTemplate指定綁定
- 9. 使用某些運算符編寫謂詞以平衡方程式
- 10. 以編程方式獲得投射和輸出運算符的類型
- 11. 以編程方式運行Cakefile
- 12. 以編程方式運行grails run-app
- 13. 以編程方式運行Outlook搜索
- 14. 如何以編程方式運行testng?
- 15. 以編程方式運行多個類
- 16. Android |以編程方式運行命令
- 17. 以編程方式定義XAML模式
- 18. 以編程方式自定義樣式
- 19. 運算符重載,運算符=在類,「沒有指定類型」
- 20. 定時運算符+,運算符,運算符*和運算符/
- 21. C編程!算術運算符操作
- 22. 指數運算符
- 23. C#:在給定時間以編程方式啓動計算機
- 24. Y-combinator如何以編程方式計算固定點?
- 25. 如何以編程方式計算不確定積分
- 26. Android - 如何爲RelativeLayout以編程方式指定權重?
- 27. 以編程方式打印PDF文件 - 指定打印機
- 28. 如何以編程方式爲鼻子指定xml輸出
- 29. 如何以編程方式在SOLR中指定update.chain
- 30. jQuery PicNet Table Filter以編程方式指定列
是的,這是可能的,但最通用的方法做就意味着學習關於[Expression Trees](http://msdn.microsoft.com/zh-cn/library/bb397951.aspx)。 :)如何確定運營商的使用情況? – 2011-05-09 19:46:09
確切複製http://stackoverflow.com/questions/1528319/operators-as-method-parameters-in-c – mcabral 2011-05-09 19:48:32