在C#中将字符串值转换为运算符

Eri*_*itz 13 c# conditional operators

我试图找出一种动态构建条件的方法.

在例子中

var greaterThan = ">";
var a = 1;
var b = 2;

if(a Convert.ToOperator(greaterThan) b) {...}
Run Code Online (Sandbox Code Playgroud)

我确实读过这篇文章,但不太明白如何实现一些东西. C#转换字符串以在逻辑条件下使用

Ano建议非常感谢

谢谢

ean*_*son 16

我不会发布它,但认为它可能会有所帮助.当然假设你在Jon的帖子中不需要高级通用逻辑.

public static class Extension
{
    public static Boolean Operator(this string logic, int x, int y)
    {
        switch (logic)
        {
            case ">": return x > y;
            case "<": return x < y;
            case "==": return x == y;
            default: throw new Exception("invalid logic");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以使用这样的代码,其中greaterThan是一个string与希望的逻辑/操作员.

if (greaterThan.Operator(a, b))
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 14

你真的不能这样做.你最接近的将是:

Func<T, T, bool> ConvertToBinaryConditionOperator<T>(string op)
Run Code Online (Sandbox Code Playgroud)

然后:

if (ConvertToBinaryConditionOperator<int>(input)(a, b))
{
}
Run Code Online (Sandbox Code Playgroud)

棘手的一点就是ConvertToBinaryConditionOperator做什么.您可能想看看Marc Gravell在MiscUtil中实现泛型运算符的工作.表达式树在这种情况下可能非常有用,尽管我相信Marc也有一种适用于.NET 2的工作方法.

所以在这种情况下你可能有类似的东西(使用MiscUtil)

public static Func<T, T, bool> ConvertToBinaryConditionOperator<T>(string op)
{
    switch (op)
    {
        case "<": return Operator.LessThan<T>;
        case ">": return Operator.GreaterThan<T>;
        case "==": return Operator.Equal<T>;
        case "<=": return Operator.LessThanOrEqual<T>;
        // etc
        default: throw new ArgumentException("op");
    }
}
Run Code Online (Sandbox Code Playgroud)


Key*_*eyo 5

更通用的方法是获取任何IComparable对象.

    public static bool Compare<T>(string op, T left, T right) where T : IComparable<T> {
        switch (op) {
            case "<": return left.CompareTo(right) < 0;
            case ">": return left.CompareTo(right) > 0;
            case "<=": return left.CompareTo(right) <= 0;
            case ">=": return left.CompareTo(right) >= 0;
            case "==": return left.Equals(right);
            case "!=": return !left.Equals(right);
            default: throw new ArgumentException("Invalid comparison operator: {0}", op);
        }
    }
Run Code Online (Sandbox Code Playgroud)