C#转换字符串以在逻辑条件下使用

是否可以将字符串转换为运算符以在逻辑条件中使用。

例如

if(x Convert.ToOperator(">") y) {} 

要么

 if(x ">" as Operator y){} 

我很欣赏这可能不是标准的练习题,所以我对那些问我为什么要做这样的事情的答案不感兴趣。

提前致谢

编辑:好的我同意,只是公平地给出一些背景。

我们有围绕reflection和XML构建的系统。 为了方便起见,我希望能够说出类似的话。

 " Condition = "0"/> 

编辑:感谢您的评论,我在这里无法正确解释。 我猜我的问题是通过“你不能”来回答的,这绝对没问题(而且我的想法)。 感谢您的意见。

编辑:Sod it我将要去。

想象一下以下内容

 " Condition="0"> 

这将被反映到一个类中,所以现在我想通过调用来测试条件

 bool LogicRule.Test() 

这就是所有人都需要聚集在一起的地方。

编辑:

好吧,所以从未看过Lambdas或Expressions,我想我会照看@ jrista的建议。

我的系统允许对Enums进行解析,因此Expressions因ExpressionType Enum而具有吸引力。

所以我创建了以下类来测试这个想法:

  public class Operation { private object _Right; private object _Left; private ExpressionType _ExpressionType; private string _Type; public object Left { get { return _Left; } set { _Left = value; } } public object Right { get { return _Right; } set { _Right = value; } } public string Type { get { return _Type; } set { _Type = value; } } public ExpressionType ExpressionType { get { return _ExpressionType; } set { _ExpressionType = value; } } public bool Evaluate() { var param = Expression.Parameter(typeof(int), "left"); var param2 = Expression.Parameter(typeof(int), "right"); Expression<Func> expression = Expression.Lambda<Func>( Expression.MakeBinary(ExpressionType, param, param2), param, param2); Func del = expression.Compile(); return del(Convert.ToInt32(Left), Convert.ToInt32(Right)); } } 

显然这只适用于Int32现在和基本的ExpressionTypes,我不确定我可以使它通用吗? 我之前从未使用过表达式,但这似乎有效。

然后可以用我们的XML方式声明这种方式

 Operation 

你可以这样做:

 public static bool Compare(string op, T x, T y) where T:IComparable { switch(op) { case "==" : return x.CompareTo(y)==0; case "!=" : return x.CompareTo(y)!=0; case ">" : return x.CompareTo(y)>0; case ">=" : return x.CompareTo(y)>=0; case "<" : return x.CompareTo(y)<0; case "<=" : return x.CompareTo(y)<=0; } } 

编辑

正如JaredPar指出的那样,我的建议不会起作用,因为你不能将运算符应用于generics……

所以你需要为你想要比较/计算的每个类型都有特定的实现…

 public int Compute (int param1, int param2, string op) { switch(op) { case "+": return param1 + param2; default: throw new NotImplementedException(); } } public double Compute (double param1, double param2, string op) { switch(op) { case "+": return param1 + param2; default: throw new NotImplementedException(); } } 

你可以这样做。

您还需要尝试/捕获所有这些以确保无论T是什么,都支持特定操作。

请注意,如果我问你为什么可能需要这样做。 你在写一些数学解析器吗?

 public T Compute (T param1, T param2, string op) where T : struct { switch(op) { case "+": return param1 + param2; default: throw new NotImplementedException(); } } public bool Compare (T param1, T param2, string op) where T : struct { switch (op) { case "==": return param1 == param2; default: throw new NotImplementedException(); } } 

不,这是不可能的,你为什么要这样做呢?

当然,您可以创建一个function:

  public static bool Compare(char op, T a, T b); 

您应该考虑使用.NET 3.5的表达式树。 您可以手动将表达式构建到表达式树(基本上是AST)中,然后调用Expression.Compile()来创建可调用的委托。 您的LogicRule.Test()方法需要构建Expression树,将树包装在LambdaExpression中,该对象将您应用规则的对象作为参数,调用Compile(),并调用生成的委托。

在以下帮助下,我做了类似的事情:

http://flee.codeplex.com/

这个工具基本上可以用来表达各种各样的表达。 基本用法是传入像’3> 4’这样的字符串,该工具将返回false。

但是,您也可以创建求值程序的实例并传入对象名称/值对,它可以更直观的IE:myObject ^ 7

您可以在codeplex网站上了解更多function。

  

我认为你可以使用隐式转换来实现这一点。 就像是:

  public static implicit operator Operator(string op) { switch(op) { case "==" : return new EqualOperator(); ... } } Operator op = "<"; if( op.Compare(x,y) ) { ... } //or whatever use syntax you want for Operator. 

Vici Parser (开源)可能对您有所帮助。 它是一个C#表达式解析器,您可以在其中传递包含表达式的字符串,然后返回计算结果。