有没有办法在c#中参数化运算符?

use*_*291 4 c# generics

假设我有2个处理程序increment_click和decrement_click,它调用常用方法

实际上我的方法可能要复杂得多,我想避免使用与if一样的语法

if (operator == "+") {
     return value = value + step
}
else {
     return value = value - step
}
Run Code Online (Sandbox Code Playgroud)

并做一些更通用的事情

increment(value, operator, step) {
     return value = value <operator> step
}
Run Code Online (Sandbox Code Playgroud)

它有可能吗?

das*_*ght 11

您可以Dictionary<string,Func<decimal,decimal,decimal>>使用运算符的实现进行设置,如下所示:

private static readonly IDictionary<string,Func<decimal,decimal,decimal>> ops = new Dictionary<string,Func<decimal,decimal,decimal>> {
    {"+", (a,b) => a + b}
,   {"-", (a,b) => a - b}
,   {"*", (a,b) => a * b}
,   {"/", (a,b) => a / b}
};
Run Code Online (Sandbox Code Playgroud)

现在你可以这样做:

decimal Calculate(string op, decimal a, decimal b) {
    return ops[op](a, b);
}
Run Code Online (Sandbox Code Playgroud)

您甚至可以通过以下方式执行此操作Linq.Expressions:使用C#中定义的预先构建的lambda,而不是使用C#中定义的预先构建的lambda,您可以以编程方式定义lambda,并将其编译为Func<T,T,T>.

  • 虽然我喜欢这个解决方案,但它并不是真正的问题的答案 - 你仍然在做运行时解析,所以本质上它只是一个重写的`switch`语句.尽管获得创造力的荣誉,+ 1 :) (2认同)