求值表达式通用C#求值条件多态性

求值表达式通用C#求值条件多态性,c#,generics,polymorphism,eval,C#,Generics,Polymorphism,Eval,我正在学习C#,我不太确定如何编写以下问题的程序。我需要创建一个能够计算表达式的类。比如说 检查两个对象/字符串是否相等 比较两个数字 对于对象和字符串,只有操作==和=是允许的,但对于数字,附加操作,=和=rhs; 案例“”: 返回左侧>右侧; 案例“我建议您采用以下通用方法: public interface ICondition { bool IsTrue(); } public class Condition<T> : ICondition { T _param

我正在学习C#,我不太确定如何编写以下问题的程序。我需要创建一个能够计算表达式的类。比如说

  • 检查两个对象/字符串是否相等
  • 比较两个数字
对于对象和字符串,只有操作
==
=是允许的,但对于数字,附加操作
=
=rhs;
案例“”:
返回左侧>右侧;

案例“我建议您采用以下通用方法:

public interface ICondition
{
  bool IsTrue();
}

public class Condition<T> : ICondition
{
  T _param1;
  T _param2;
  Func<T,T,bool> _predicate;

  public Condition<T>(T param1, T param2, Func<T,T,bool> predicate)
  {
    _param1 = param1;
    _param2 = param2;
    _predicate = predicate;
  }

  public bool IsTrue(){ return _predicate(_param1,_param2);}
}

public static void Test()
{
  var x = 2;
  var y = 5;
  var foo = "foo";
  var bar = "bar";     
  var conditions = new List<ICondition>
  {
    new Condition(x,y, (x,y) => y % x == 0),
    new Condition(foo,bar, (f,b) => f.Length == b.Length)
  }

  foreach(var condition in conditions)
  {
    Console.WriteLine(condition.IsTrue());
  }
}
公共接口i条件
{
布尔伊斯特鲁();
}
公共类条件:ICondition
{
T_参数1;
T_参数2;
Func_谓词;
公共条件(T参数1,T参数2,Func谓词)
{
_param1=param1;
_param2=param2;
_谓词=谓词;
}
public bool IsTrue(){return_谓词(_param1,_param2);}
}
公共静态无效测试()
{
var x=2;
变量y=5;
var foo=“foo”;
var bar=“bar”;
var条件=新列表
{
新条件(x,y,(x,y)=>y%x==0),
新条件(foo,bar,(f,b)=>f.长度==b.长度)
}
foreach(条件中的var条件)
{
Console.WriteLine(condition.IsTrue());
}
}

对于对象和字符串,不要使用==和!=使用以下命令:string a=“hello”string b=“world”bool blnEquals=a.Equals(b);@mac,谢谢,我会考虑到这一点。
public class Condition : Condition<string,object>
{      
    public override bool Execute()
    {
        switch(this.mode)
        {
            case "==":
                return lhs == rhs;
            case "!=":
                return lhs != rhs;
            default:
                throw new ArgumentException("Mode '" + mode + "' does not exists");
        }
    }
}

public class Condition : Condition<uint16,uint32,uint64,int16,int32,int64,double,float>
{      
    public override bool Execute()
    {
        switch(this.mode)
        {
            case "==":
                return lhs == rhs;
            case "!=":
                return lhs != rhs;
            case ">=":
                return lhs >= rhs;
            case "<=":
                return lhs <= rhs;
            case ">":
                return lhs > rhs;
            case "<":
                return lhs < rhs;
            default:
                throw new ArgumentException("Mode '" + mode + "' does not exists");       
        }
    }
}
Cond1 = Condition('test','==','test');
Cond2 = Condition(12,'>',13);
Cond3 = Condition(14,'<',13.6);
result1 = Cond1.Execute();
result2 = Cond2.Execute();
result3 = Cond3.Execute();
public interface ICondition
{
  bool IsTrue();
}

public class Condition<T> : ICondition
{
  T _param1;
  T _param2;
  Func<T,T,bool> _predicate;

  public Condition<T>(T param1, T param2, Func<T,T,bool> predicate)
  {
    _param1 = param1;
    _param2 = param2;
    _predicate = predicate;
  }

  public bool IsTrue(){ return _predicate(_param1,_param2);}
}

public static void Test()
{
  var x = 2;
  var y = 5;
  var foo = "foo";
  var bar = "bar";     
  var conditions = new List<ICondition>
  {
    new Condition(x,y, (x,y) => y % x == 0),
    new Condition(foo,bar, (f,b) => f.Length == b.Length)
  }

  foreach(var condition in conditions)
  {
    Console.WriteLine(condition.IsTrue());
  }
}