日期:2014-05-20  浏览次数:20752 次

关于表达式树的类型转换的一点问题
现有两个类
 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);
    }
}