排名
                
                
                    6
                
            
                    文章
                
                
                    6
                
            
                    粉丝
                
                
                    16
                
            
                    评论
                
                
                    8
                
            
            {{item.articleTitle}}
            
    {{item.blogName}} : {{item.content}}
        
            ICP备案  :渝ICP备18016597号-1
        
        
            网站信息:2018-2025TNBLOG.NET
        
        
            技术交流:群号656732739
        
        
            联系我们:contact@tnblog.net
        
        
            公网安备:
50010702506256
        
    
50010702506256
        
        
            欢迎加群交流技术
        
    
    
    分类:
    .NET
问题描述:
Expression<Func<AClass,bool>> expression 如何转成Expression<Func<BClass,bool>> expression 其中类型的属性相同。
解决方法:
使用ExpressionVisitor,去遍历表达式树,然后重建目标类型的表达式
效果如下,可以把Expression<Func<AClass,bool>> 转换成Expression<Func<BClass,bool>>:
代码如下:
测试代码:
public class AClass
{
}
public class BClass
{
}
class Program2
{
    static void Main(string[] args)
    {
        Expression<Func<AClass, bool>> expression = a => true;
        AJExpressionVisitor<BClass> ufExpressionVisitor = new AJExpressionVisitor<BClass>();
        Expression<Func<BClass, bool>> lamdba =
            ufExpressionVisitor.Modify(expression) as Expression<Func<BClass, bool>>;
        Test(lamdba);
    }
    public static void Test(Expression<Func<BClass, bool>> expression)
    {
        //解析.....
    }
}转换类:
/// <summary>
/// 转换类
/// </summary>
public class AJExpressionVisitor<X> : ExpressionVisitor
{
    /// <summary>
    /// 替换参数
    /// </summary>
    public ParameterExpression pe { get; set; }
    public AJExpressionVisitor()
    {
        var parameter = Expression.Parameter(typeof(X), "a");
        this.pe = parameter;
    }
    /// <summary>
    /// 修改表达式
    /// </summary>
    /// <param name="expression">待修改的表达式</param>
    /// <returns>修改后的表达式</returns>
    public Expression Modify(Expression expression)
    {
        return this.Visit(expression);
    }
    protected override Expression VisitLambda<T>(Expression<T> node)
    {
        return Expression.Lambda(Traverse(node.Body), pe);
    }
    /// <summary>
    /// 遍历转换表达式
    /// </summary>
    /// <param name="expression">表达式</param>
    /// <returns>转换后的表达式</returns>
    private Expression Traverse(Expression expression)
    {
        //二无表达式的处理
        if (expression is BinaryExpression)
        {
            var left = Traverse((expression as BinaryExpression).Left);
            var right = Traverse((expression as BinaryExpression).Right);
            return Expression.MakeBinary((expression as BinaryExpression).NodeType, left, right);
        }
        //成员表达式的处理
        if (expression is MemberExpression)
        {
            MemberExpression me = Expression.Property(pe, (expression as MemberExpression).Member.Name);
            return me;
        }
        //常量表达式的处理
        if (expression is ConstantExpression)
        {
            return expression;
        }
        //方法调用表达式的处理
        if (expression is MethodCallExpression)
        {
            var mcExpression = expression as MethodCallExpression;
            var body = Traverse(mcExpression.Object);
            return Expression.Call(body, mcExpression.Method, mcExpression.Arguments);
        }
        return expression;
    }
}欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)
评价