是否有表示运算符类型的.NET类?

时间:2010-05-04 17:22:49

标签: c# .net

我想做以下事情:

*OperatorType* o = *OperatorType*.GreaterThan;

int i = 50;

int increment = -1;

int l = 0;

for(i; i o l; i = i + increment)
{
    //code
}

这个概念可以使用eval()在javascript中进行克制...但是这个想法是有一个循环 可以根据运行时设置的值前进或后退。

这可能吗?

由于

5 个答案:

答案 0 :(得分:13)

是的,它在.NET中Expression trees.具体来说,您需要使用BinaryExpression.Add()。构建表达式树不需要手工完成,编译器将乐于将它看到分配给Expression<T>的任何lambda表达式转换为有效的表达式树。

// Creating an expression tree.
Expression<Func<int, int, bool>> greaterThan = (l, r) => l > r;

int i = 50;

int increment = -1;

int l = 0;

for(i; greaterThan(o, i); i = i + increment)
{
    //code
}

调用表达式树会自动将其编译为动态方法,而且更有效的方法就像委托一样。

答案 1 :(得分:4)

Func<int,int,bool> op = (i1, i2) => i1 > i2;

然后

op(i, l);

答案 2 :(得分:2)

编辑:添加一个lambda函数:

    Func<int, int, bool> lessThan = (num1, num2) => num1 < num2;
    Func<int, int, bool> greaterThan = (num1, num2) => num1 > num2;
    public void Run()
    {
        int increment = -1;
        int l = 0;
        Func<int, int, bool> c = lessThan;
        for (int i = 50; c(i, l); i = i + increment)
        {

        }
    }

我相信人们会提出比这更优雅的解决方案,但这里是:

    public enum Comparison
    {
        GreaterThan,
        LessThan
    }
    public bool Compare(int a, Comparison c, int b)
    {
        if (c == Comparison.GreaterThan)
            return a > b;
        else if (c == Comparison.LessThan)
            return a < b;
        else
            throw new ArgumentException();
    }

    public void Run()
    {
        int i = 50;
        int increment = -1;
        int l = 0;
        Comparison c = Comparison.GreaterThan;
        for (i; Compare(i, c, l); i = i + increment)
        {

        }
    }

答案 3 :(得分:1)

        Func<int, int, bool> o = (x, y) => x > y;

        int i = 50;

        int increment = -1;

        int l = 0;

        for(; o(i, l) ; i = i + increment)
        {
            //code
        }

或完全摆脱l:

        Predicate<int> o = (x) => x > 0;

        int i = 50;

        int increment = -1;

        for(; o(i) ; i = i + increment)
        {
            //code
        }

答案 4 :(得分:0)

您可以定义自己的类并实现自己的运算符,请参阅http://msdn.microsoft.com/en-us/library/aa288467(VS.71).aspx

- 编辑
哦,误解了你想要的东西,最好的方法是使用表达式或Func&lt;&gt;安德烈伤心。