下面是一个把C#使用比较操作符的字符串作为参数来构造一个委托
比如我告诉一个方法,我现在要比较x,y两个值,但具体是大于,还是小于,还是其它,我用操作符的字符串来当成参数,比如传递一个">"字符串给函数,我是要比较x是否大于y,然后返回一个bool型的结果
实现代码如下:
using System;
using System.Linq.Expressions;
class DynamicPredicate
{
public static Expression<Func<T, T, bool>>
Generate<T>(string op)
{
ParameterExpression x =
Expression.Parameter(typeof(T), "x");
ParameterExpression y =
Expression.Parameter(typeof(T), "y");
return Expression.Lambda<Func<T, T, bool>>
(
(op.Equals(">")) ? Expression.GreaterThan(x, y) :
(op.Equals("<")) ? Expression.LessThan(x, y) :
(op.Equals(">=")) ? Expression.GreaterThanOrEqual(x, y) :
(op.Equals("<=")) ? Expression.LessThanOrEqual(x, y) :
(op.Equals("!=")) ? Expression.NotEqual(x, y) :
Expression.Equal(x, y),
x, y
);
}
}
static void Main()
{
string op = ">=";
var integerPredicate =
DynamicPredicate.Generate<int>(op).Compile();
var floatPredicate =
DynamicPredicate.Generate<float>(op).Compile();
int iA = 12, iB = 4;
Console.WriteLine("{0} {1} {2} : {3}", iA, op, iB,
integerPredicate(iA, iB));
float fA = 867.0f, fB = 867.0f;
Console.WriteLine("{0} {1} {2} : {3}", fA, op, fB,
floatPredicate(fA, fB));
Console.WriteLine("{0} {1} {2} : {3}", fA, ">", fB,
DynamicPredicate.Generate<float>(">").Compile()(fA, fB));
}