【问题标题】:programmatically specify operator以编程方式指定运算符
【发布时间】:2011-08-21 22:47:49
【问题描述】:

是否可以指定运算符R,其中R 可以是算术、关系或逻辑运算符?

例如一个计算函数

c = a R b

我可以在哪里指定R 是否为+, -, *, /

这可以在 C# 中完成吗?

【问题讨论】:

标签: c# operators


【解决方案1】:

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);

【讨论】:

    【解决方案2】:

    你可以用 lambda 做一些非常接近的事情:

    Func<int, int, int> op = (x, y) => x + y; // or any other operator
    

    然后像任何其他委托一样使用它:

    int result = op(1, 2);
    

    如果有问题的类型是用户使用重载运算符定义的,您可以使用反射,但恐怕对于 int 这样的类型是不可能的。

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        在 C# 中可能存在运算符重载,请查看一些 MSDN

        http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx

        【讨论】:

        • 听起来 OP 并不想改变给定运算符的功能 - 听起来,给定两个操作数,他们想在运行时选择操作。
        • 他要求指定运算符,而不是在类/结构中重载其行为
        • 我认为这是一个很好的答案;它可用于获得所需的功能。
        猜你喜欢
        • 1970-01-01
        • 2013-08-31
        • 2016-11-14
        • 2022-01-23
        • 1970-01-01
        • 2012-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多