Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行时更改表达式树_C# - Fatal编程技术网

C# 在运行时更改表达式树

C# 在运行时更改表达式树,c#,C#,我不熟悉C表达式树 我将表达式树传递给一个方法,如下所示: private void MyMethod(System.Linq.Expressions.Expression exp, string param) 我需要能够调整这个exp,并在运行时基于param值添加两个and子句。 请问我如何做到这一点 调用此方法的示例如下: var temp= MyOtherMethod(cellValue.ExpressionObj, columnName); 谢谢。你应该看看 如何使用它的好例子可以

我不熟悉C表达式树

我将表达式树传递给一个方法,如下所示:

private void MyMethod(System.Linq.Expressions.Expression exp, string param)
我需要能够调整这个exp,并在运行时基于param值添加两个and子句。 请问我如何做到这一点

调用此方法的示例如下:

var temp= MyOtherMethod(cellValue.ExpressionObj, columnName);
谢谢。

你应该看看

如何使用它的好例子可以在博客文章中找到

表达式是不可变的,您需要将新表达式返回给调用方才能使用修改后的表达式

长话短说:

private Expression MyMethod(Expression<MyClass> exp, string param) {
    if(param == "something") {
        var visitor = new CustomVisitor(); /// You should implement one based on your needs
        return visitor.Visit(exp);
    }
}
编辑:


是的,我指的是表达式。谢谢。请提供一个调用此方法的示例。要了解的最重要的一点是,您永远不会更改表达式树。创建一棵具有所需特征的新树;如果对你有帮助的话,你可以自由地使用老树的一部分,因为老树不会被改变。我回顾了你的改变,答案仍然是一样的。您应该继承ExpressionVisitor类并重写VisitLambda方法。在这里,您应该更改表达式。
public class AndAlsoVisitor : ExpressionVisitor {
    protected override Expression VisitLambda<T>(Expression<T> node) {
        // Make it lambda expression
        var lambda = node as LambdaExpression;

        // This should never happen
        if (node != null) {
            // Create property access 
            var lengthAccess = Expression.MakeMemberAccess(
                lambda.Parameters[0],
                lambda.Parameters[0].Type.GetProperty("Length")
            );

            // Create p.Length >= 10
            var cond1 = Expression.LessThanOrEqual(lengthAccess, Expression.Constant(10));
            // Create p.Length >= 3
            var cond2 = Expression.GreaterThanOrEqual(lengthAccess, Expression.Constant(3));
            // Create p.Length >= 10 && p.Length >= 3
            var merged = Expression.AndAlso(cond1, cond2);
            // Merge old expression with new one we have created
            var final = Expression.AndAlso(lambda.Body, merged);
            // Create lambda expression
            var result = Expression.Lambda(final, lambda.Parameters);

            // Return result
            return result;
        }

        return null;
    }
}