繁体   English   中英

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

[英]Is there a way to parameterize operator in c#

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

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

if (operator == "+") {
     return value = value + step
}
else {
     return value = value - step
}

并做一些更通用的事情

increment(value, operator, step) {
     return value = value <operator> step
}

它有可能吗?

您可以创建一个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}
};

现在你可以这样做:

decimal Calculate(string op, decimal a, decimal b) {
    return ops[op](a, b);
}

你甚至可以通过Linq.Expressions一些“魔法”来实现这Linq.Expressions :不是使用C#中定义的预先构建的lambda,而是可以通过编程方式定义lambda,并将它们编译为Func<T,T,T>

我不认为这更好,但它是不错的选择

int sign = (operator == "+" ? 1 : -1);
retrun value +sign*value;

我不确定你的整个用例是什么,但它似乎适合雇用代表。 让我们从定义委托开始:

public delegate T Operation<T>(T arg, T step);

现在让我们假设您有一个带运算符的类:

public class Foo
{
    public static Foo operator + (Foo left, Foo right) { ... } 
    public static Foo operator + (Foo left, Foo right) { ... } 
}

在您想要一般处理逻辑的类中,您可以使用类似的代码:

public class Bar
{
    // The method you look for:
    public Foo Increment(Foo value, string @operator, Foo step)
    {
         Operation<Foo> operation = null;

         switch(@operator)
         {
             case "+":
                 operation = (v, s) => v + s;
                 break;
             case "-":
                 operation = (v, s) => v - s;
                 break;
             ...
         }

         if (operation != null)
         {
             return operation(value, step);
         }
         else
         {
             throw new NotSupportedException(
                 "Operator '" +  @operator "' is not supported");
         }
    }
}

为了清楚起见,我可以使用.NET中支持这些操作的任何基本类型( intdoublelong等)来代替我使用的Foo类。
而不是定义自己的委托(如Operation<T> ,您可以使用内置Func<T, T>
我建议使用枚举而不是字符串作为运算符( +- ,...),因为字符串将允许传递无效值。

不,您只能参数化变量,并对类型进行泛化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM