回答
一个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