c#中将字符串值转换为操作符

本文关键字:转换 操作符 字符串 | 更新日期: 2023-09-27 18:06:03

我正试图找出一种方法来动态地建立一个条件。

下面是我的代码:
var greaterThan = ">";
var a = 1;
var b = 2;
if (a Convert.ToOperator(greaterThan) b) {...}

我确实读了这篇文章,但不知道如何实现一些东西:c#转换字符串用于逻辑条件

任何建议都非常感谢。谢谢。

c#中将字符串值转换为操作符

我本来不打算把它贴出来,但我觉得它可能会有所帮助。当然,假设你不需要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");
        }
    }
}

您可以这样使用代码,其中greaterThan是具有所需逻辑/运算符的string

if (greaterThan.Operator(a, b))

你不能这么做。最接近的值是:

Func<T, T, bool> ConvertToBinaryConditionOperator<T>(string op)

然后:

if (ConvertToBinaryConditionOperator<int>(input)(a, b))
{
}

棘手的是ConvertToBinaryConditionOperator会做什么。您可能想看看Marc Gravell在MiscUtil中实现泛型操作符的工作。在这种情况下,表达式树可能真的很有用,尽管我相信Marc有一个工作方法,也适用于。net 2。

在这个例子中你可以输入(using 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");
    }
}

一种更通用的方法是取任意iccomparable对象

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