Also habe ich in letzter Zeit mit dem dynamischen Erstellen von Expression-Bäumen gespielt und bin auf diese Methode gestoßen, die irgendwie merkwürdig wirkt. Zuerst dachte ich, „oh kühl das ist genau das, was ich brauche“, nachdem ständig Code entlang der Linien vonExpression.Bind() - was macht es eigentlich?
var left = member is FieldInfo ? Expression.Field(instance, (FieldInfo)member) : Expression.Property(instance, (PropertyInfo)member);
var right = ...
var assign = Expression.Assign(left, right);
Schreiben Ja, ich weiß, es ist Expression.PropertyOrField()
Anruf, aber es hat Folgendes zu bieten: zurück zum Reflexionselement zu finden nach Namen , wo ich normalerweise bereits MemberInfo
Instanz habe.
So jedenfalls dachte ich Expression.Bind()
wäre nützlich für mich, aber es tut etwas, was ich nicht wirklich verstehe. Angesichts der folgenden Code:
void Main()
{
var m = typeof(Foo).GetField("Bar");
Expression.Bind(m, Expression.Constant("")).Dump();
}
public class Foo
{
public string Bar;
}
es produziert MemberAssignment
Ausdruck Bar = ""
. Aber es gibt keine Instanz und keine statische Referenz. Wie würde ich diesen Ausdruck jemals auf eine Instanz von Foo
anwenden? Ich kann kein Beispiel für diese Methode finden.
oooh ... Ich dachte, das ist, was es ist, aber ich erwartete eine Überladung von 'Expression.New()', das zu akzeptieren. Es kam mir nicht in den Sinn, dass das ein ganz anderer Anruf sein könnte. –
Wenn Sie 'PropertyOrField' nicht verwenden: das ist nicht wirklich Optimierung. Mehr wie für meine eigene Gesundheit. –
Ah, wenn das der Fall ist, warum schreibe dann nicht einen kleinen Helfer, der eine 'MemberInfo' nimmt und die Zweige entsprechend verzweigt? – Ani