c#3.0中引入了表达式树,使用泛型表达式树可以方便的解决问题。举一个简单的例子,我们可以使用它来完成不同类型的数值的加减乘除。首先,来看一下简单的思路:(下述代码仅仅以加法运算来示例)
static class Calculate<T>
{
public static T Add(T num1, T num2)
{
return num1 + num2;
}
}
然而这个代码编译是不能通过的,因为泛型不可以进行相加的操作。这种简单的思路行不通,下面来看使用表达式树的解决方案:
static class Calculate<T>
{
public static T Add(T num1, T num2)
{
//创建参数表达式树节点1
ParameterExpression p1 = Expression.Parameter(typeof(T), "left");
//创建参数表达式树节点2
ParameterExpression p2 = Expression.Parameter(typeof(T), "right");
//两个参数节点构成二叉树节点,节点关系为求和
BinaryExpression p_add = Expression.Add(p1, p2);
//定义lambda表达式,这个可以看一下msdn的说明,(Func<T,T,T>也是一个类型)
Expression<Func<T, T, T>> fe = Expression.Lambda
<Func<T, T, T>>(p_add, new ParameterExpression[] { p1, p2 });
//转化为匿名代理
Func<T, T, T> fc = fe.Compile();
//返回结果
return fc(num1, num2);
}
}
这样就可以对不同类型的数值进行加操作了:
Console.WriteLine(Calculate<int>.add(3, 5));