我试图找出一种动态构建条件的方法。
在示例中
var greaterThan = ">";
var a = 1;
var b = 2;
if(a Convert.ToOperator(greaterThan) b) {...}
我确实读过这篇文章,但不太明白如何实现一些东西。 C# convert a string for use in a logical condition
Ano建议非常感谢
由于
答案 0 :(得分:15)
我不会发布它,但认为它可能会有所帮助。当然假设你在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))
答案 1 :(得分:14)
你真的不能这样做。你最接近的将是:
Func<T, T, bool> ConvertToBinaryConditionOperator<T>(string op)
然后:
if (ConvertToBinaryConditionOperator<int>(input)(a, b))
{
}
棘手的一点是ConvertToBinaryConditionOperator
会做什么。您可能希望查看Marc Gravell's work on implementing generic operators in 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");
}
}
答案 2 :(得分: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);
}
}