将Expression <Func >动态转换为Expression <Func
我找不到从Expression <Func >转换为Expression <Func >的方法。 因为我使用了大量的reflection,实际上,我真正需要的是一种采用类型参数并执行转换的方法。
public object Convert(Expression<Func> expr, Type t);
T2来自T1
public class T1 { int FamilyId {get; set;} } public class T2 : T1 { ... other properties }
我在基类上定义了一个filter表达式
Expression<Func> filter = p => p.FamilyId == [some value]
我想申请List
这是你在找什么? 该方法有两种forms:第一种允许您将新输入类型作为参数传递; 第二个允许您将输入类型作为generics参数传递,并获得强类型的LambdaExpression。
public static LambdaExpression ChangeInputType(Expression> expression, Type newInputType) { if (!typeof(T).IsAssignableFrom(newInputType)) throw new Exception(string.Format("{0} is not assignable from {1}.", typeof(T), newInputType)); var beforeParameter = expression.Parameters.Single(); var afterParameter = Expression.Parameter(newInputType, beforeParameter.Name); var visitor = new SubstitutionExpressionVisitor(beforeParameter, afterParameter); return Expression.Lambda(visitor.Visit(expression.Body), afterParameter); } public static Expression> ChangeInputType(Expression> expression) { if (!typeof(T1).IsAssignableFrom(typeof(T2))) throw new Exception(string.Format("{0} is not assignable from {1}.", typeof(T1), typeof(T2))); var beforeParameter = expression.Parameters.Single(); var afterParameter = Expression.Parameter(typeof(T2), beforeParameter.Name); var visitor = new SubstitutionExpressionVisitor(beforeParameter, afterParameter); return Expression.Lambda>(visitor.Visit(expression.Body), afterParameter); } public class SubstitutionExpressionVisitor : ExpressionVisitor { private Expression before, after; public SubstitutionExpressionVisitor(Expression before, Expression after) { this.before = before; this.after = after; } public override Expression Visit(Expression node) { return node == before ? after : base.Visit(node); } }
你的要求是非常不明智的。 编译器如何知道T1是否可以转换为T2? 似乎即使有可能也要求可怕的运行时错误。*
(*我认为它不可能,因为你试图将refection与嵌套generics类型结合起来。)
看起来你想要组合2个表达式 – T2
到T1
转换,而不是用给定的结果调用expr
。
这个问题讨论了一般结合两个表达式(Expression
上述就是C#学习教程:将Expression <Func >动态转换为Expression <Func分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/997026.html