读书人

关于表达式树的类型转换的一点有关问题

发布时间: 2012-08-01 17:53:41 作者: rapoo

关于表达式树的类型转换的一点问题
现有两个类
class MyData
{
public int v1 {get;set;}
public int v2 { get; set; }
}
class YouData
{
public int v1 { get; set; }
public int v2 { get; set; }
}
定义一个lambda表达式树
Expression<Func<MyData,int>> exp = m=>m.v1 + m.v2 + m.v1 * 5 - m.v2 *3;
有什么方法能让下面的表达式树满足:
Expression<Func<YouData,int>> exp2

exp2和exp只是参数不一样。

好像是可以用ExpressionVisitor来把exp的类型改为YouData,具体如何实现,请高手指点。

[解决办法]
你的YouData和MyData 要么同实现一接口,或者有继承的关系。
不然无法转换。

C# code
public class MyData : YouData{}public class YouData{    public int v1 { get; set; }    public int v2 { get; set; }}public class Service{    public int count(Expression<Func<YouData, bool>> exp)    {        //便于测试        return 1;    }}//重写Expression 访问类public class MyExpressionVisitor : System.Linq.Expressions.ExpressionVisitor{    public ParameterExpression Parameter    {        get;        set;    }    public Expression ModifyExp(Expression exp)    {        return this.Visit(exp);    }    protected override Expression VisitParameter(ParameterExpression node)    {        return Parameter;    }}public class MyApp{    public int count(Expression<Func<MyData, bool>> exp)    {        ParameterExpression param = Expression.Parameter(typeof(YouData), "name");        MyExpressionVisitor expVisitor = new MyExpressionVisitor();        expVisitor.Parameter = param;        Expression expBody = expVisitor.ModifyExp(exp.Body);        var finalExp = Expression.Lambda<Func<YouData, bool>>(expBody, param);        return new Service().count(finalExp);    }} 

读书人网 >.NET

热点推荐