关于表达式树的类型转换的一点有关问题
关于表达式树的类型转换的一点问题
现有两个类
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 要么同实现一接口,或者有继承的关系。
不然无法转换。
现有两个类
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); } }