C# 调用相等的表达式方法

C# 调用相等的表达式方法,c#,lambda,expression,C#,Lambda,Expression,当我运行此代码时 Expression left = Expression.Constant(10, typeof(int)); Expression right = Expression.Constant(10,typeof(int)); var method10 = typeof(Expression).GetMethod("Equal", new[] { typeof(Expression), typeof(Expression) }); Expression exp = Express

当我运行此代码时

Expression left = Expression.Constant(10, typeof(int));
Expression right = Expression.Constant(10,typeof(int));

var method10 = typeof(Expression).GetMethod("Equal", new[] { typeof(Expression), typeof(Expression) });
Expression exp = Expression.Call(method10,left,right);
var lambda = Expression.Lambda<Func<bool>>(exp);
var compiled = lambda.Compile().DynamicInvoke();
Expression left=Expression.Constant(10,typeof(int));
表达式右=表达式常数(10,typeof(int));
var method10=typeof(Expression).GetMethod(“相等”,新[]{typeof(Expression),typeof(Expression)});
Expression=Expression.Call(method10,左,右);
var lambda=表达式.lambda(exp);
var compiled=lambda.Compile().DynamicInvoke();
我得到下面的错误

其他信息:类型为
'System.Int32'
的表达式不能用于方法
'System.Linq.Expressions.Expression'
的类型为
'System.Linq.Expressions.BinaryExpression Equal(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression)
请重试

var exp = Expression.MakeBinary(ExpressionType.Equal, left, right);
而不是

var method10 = typeof(Expression).GetMethod("Equal", new[] { typeof(Expression), typeof(Expression) });
Expression exp = Expression.Call(method10,left,right);
试一试

而不是

var method10 = typeof(Expression).GetMethod("Equal", new[] { typeof(Expression), typeof(Expression) });
Expression exp = Expression.Call(method10,left,right);

你不需要反思,除非我遗漏了什么:

Expression left = Expression.Constant(10, typeof(int));
Expression right = Expression.Constant(10,typeof(int));
Expression exp = Expression.Equal(left, right);
var lambda = Expression.Lambda<Func<bool>>(exp);
但是请注意有一个细微的区别:
表达式.Equal
将使用
=
运算符,而另一个代码将使用
Equals
方法

如果确实要从字符串生成表达式,请执行以下操作:

string methodName = "Equal";
MethodInfo method10 = typeof(Expression).GetMethod(methodName, new[] { typeof(Expression), typeof(Expression) });
Expression exp = (Expression)method10.Invoke(null, new object[] { left, right });
var lambda = Expression.Lambda<Func<bool>>(exp);

使用
Enum.Parse

不需要反射,除非我遗漏了什么:

Expression left = Expression.Constant(10, typeof(int));
Expression right = Expression.Constant(10,typeof(int));
Expression exp = Expression.Equal(left, right);
var lambda = Expression.Lambda<Func<bool>>(exp);
但是请注意有一个细微的区别:
表达式.Equal
将使用
=
运算符,而另一个代码将使用
Equals
方法

如果确实要从字符串生成表达式,请执行以下操作:

string methodName = "Equal";
MethodInfo method10 = typeof(Expression).GetMethod(methodName, new[] { typeof(Expression), typeof(Expression) });
Expression exp = (Expression)method10.Invoke(null, new object[] { left, right });
var lambda = Expression.Lambda<Func<bool>>(exp);

使用
Enum.Parse

我解决了这个问题。谢谢各位

Expression left = Expression.Constant(10, typeof(int));
Expression right = Expression.Constant(10, typeof(int));
ExpressionType expressionType;
var tryParseRes = ExpressionType.TryParse("NotEqual", out expressionType);
var exp = Expression.MakeBinary(expressionType, left, right);
var lambda = Expression.Lambda<Func<bool>>(exp);
var compiled = lambda.Compile().DynamicInvoke();
if ((bool)compiled == false)
    areEventCondiotionsPassed = false;
Expression left=Expression.Constant(10,typeof(int));
表达式右=表达式常数(10,typeof(int));
表达式类型表达式类型;
var tryParseRes=ExpressionType.TryParse(“NotEqual”,out ExpressionType);
var exp=Expression.MakeBinary(expressionType,左,右);
var lambda=表达式.lambda(exp);
var compiled=lambda.Compile().DynamicInvoke();
if((bool)compiled==false)
AreEventConditionsPassed=假;

我解决了它。谢谢各位

Expression left = Expression.Constant(10, typeof(int));
Expression right = Expression.Constant(10, typeof(int));
ExpressionType expressionType;
var tryParseRes = ExpressionType.TryParse("NotEqual", out expressionType);
var exp = Expression.MakeBinary(expressionType, left, right);
var lambda = Expression.Lambda<Func<bool>>(exp);
var compiled = lambda.Compile().DynamicInvoke();
if ((bool)compiled == false)
    areEventCondiotionsPassed = false;
Expression left=Expression.Constant(10,typeof(int));
表达式右=表达式常数(10,typeof(int));
表达式类型表达式类型;
var tryParseRes=ExpressionType.TryParse(“NotEqual”,out ExpressionType);
var exp=Expression.MakeBinary(expressionType,左,右);
var lambda=表达式.lambda(exp);
var compiled=lambda.Compile().DynamicInvoke();
if((bool)compiled==false)
AreEventConditionsPassed=假;

非常感谢。它起作用了。但是我希望一些东西是动态的,能够调用任何方法,比如Equal、NotEqual等,并将我的代码保持在5到10行。它起作用了。但我希望它是动态的,能够调用任何方法,比如Equal、NotEqual等,并将我的代码保持在5到10行。你知道,我希望有一个有3个输入的方法。第一个:字符串,如GreaterThan、GreaterThanOrEqual、Equal、NotEqual等。第二个:int或string,第三个:int或string。并调用第一个方法,该方法是其他两个参数的字符串。@unosbaghaii然后使用Ondrej方法并使用参数
ExpressionType.Equal
我想从string@unosbaghaii你知道,我想要一个有3个输入的方法。第一个:字符串,如GreaterThan、GreaterThanOrEqual、Equal、NotEqual等。第二个:int或string,第三个:int或string。并调用第一个方法,该方法是其他两个参数的字符串。@unosbaghaii然后使用Ondrej方法并使用参数
ExpressionType.Equal
我想从string@unosbaghaii现在看,你是对的。是Visual Studio没有显示它。你是对的。是VisualStudio没有显示它。