Lambda-Parameter nicht im Bereich - beim Erstellen binärer Lambda-Ausdruck

c# expression-trees lambda

Frage

Wenn ich manuell einen Lambda-Ausdruck erstelle, erhalte ich die Ausnahme "Parameter nicht im Bereich".

Irgendwelche Ideen, was ich falsch mache?

 public class OtherType
    {
        public string First_Name { get; set; }
        public string Last_Name { get; set; }

    }
    static void Main(string[] args)
        {

          Expression<Func<OtherType, bool>> l2 = 
                p => p.First_Name == "Bob";
            l2.Compile();  // Works 


            PropertyInfo property = 
                typeof(OtherType).GetProperty("First_Name");

            ParameterExpression para = 
                Expression.Parameter(typeof(OtherType), "para");

            ConstantExpression right = 
                Expression.Constant("Bob", typeof(string));

            MemberExpression left = 
                Expression.Property(Expression.Parameter(typeof(OtherType), "para"), property);

            BinaryExpression binary = 
                Expression.MakeBinary(ExpressionType.Equal, left, right);

            Expression<Func<OtherType, bool>> l = 
                Expression.Lambda<Func<OtherType, bool>>(binary, new ParameterExpression[] { para });

            l.Compile(); // Get a 'Lambda Parameter not in scope' exception

}

Akzeptierte Antwort

Sie müssen das gleiche Parameterobjekt wiederverwenden. Also wo hast du:

 MemberExpression left = Expression.Property
     (Expression.Parameter(typeof(OtherType), "para"), property);

es sollte sein:

 MemberExpression left = Expression.Property
     (Expression.Parameter(typeof(OtherType), "para"), property);

Ich weiß, dass es sinnvoll wäre, wenn sie mit dem Namen übereinstimmen, aber das ist nicht so, wie es funktioniert :(

Wenn es überhaupt einen Trost gibt, bekomme ich sehr selten beim ersten Mal handgefertigte Ausdrucksbäume. Ich muss für eine Weile auf sie schwören. Auf der anderen Seite glaube ich, dass Marc Gravell an kalten Tagen vorsichtig ausatmen kann und sein Atem in Form von perfektem, frostigen Ausdrucksbaumcode ausgeht ...




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum