Ich versuche festzustellen, ob eine MemberExpression
zu einer Objektinstanz gehört oder ob es nur ein Parameter in einem Ausdruck ist. Ich kam auf, was ich für eine brauchbare Lösung halte, aber ich möchte dies zuerst mit SE ausführen. Nehmen Sie diese beiden Ausdrücke für den Anfang:Ermitteln, ob eine MemberExpression zu einer Instanz gehört
var myClassInstance = new MyClass();
Expression<Func<MyClass, bool>> exp1 = mc => myClassInstance.MyBool;
Expression<Func<MyClass, bool>> exp2 = mc => mc.MyBool;
exp1
enthält einen Verweis auf eine lokale Variable/Feld. Weiter unten in meinem Code wird .MyBool
kompiliert werden, um dessen Wert wie folgt abzurufen:
Expression.Lambda<Func<object>>(Expression.Convert(exp1.Body as MemberExpression, typeof(object))).Compile();
In exp2
, .MyBool
nicht von einer Objektreferenz, sondern ein paremeter. Wenn ich versuchen würde, den Ausdruck .MyBool
zu kompilieren, würde die Ausnahme variable 'mc' of type 'ConsoleLol.MyClass' referenced from scope '', but it is not defined
ausgelöst werden.
Nach einiger Mühe, ich habe mit dieser potentiellen Lösung zu kommen:
var exp1parent = (exp1.Body as MemberExpression).Expression;
var exp2parent = (exp2.Body as MemberExpression).Expression;
Console.WriteLine(exp1parent.NodeType);
Console.WriteLine(exp2parent.NodeType);
Es scheint, dass, wenn die Mutter Ausdruck Ausdruck keine Instanz ist, wird die NodeType
Eigenschaft Parameter
sein. Ansonsten wird es in diesem Fall etwas anderes sein, in diesem Fall MemberAccess
.
Bin ich in dieser Schlussfolgerung richtig oder gibt es eine bessere Methode, diese Prüfung durchzuführen?
Können Sie erklären, was Sie eigentlich versuchen? Warum ist der Ausdruck 'Expression>', wenn Sie scheinbar nicht 'MyClass' haben, um ihn zu übergeben? Warum verwenden Sie nicht den Ausdruck > ', der all dies vermeiden würde? –
svick
@svick Nicht sicher, was du meinst. 'Func' definiert eine 'MyClass' als Parameter und gibt ein' bool' zurück. Außerdem brauche ich 'MyClass', weil ich damit einen Ausdruck in SQL umwandle.Ich muss wissen, ob der Ausdruck zu einem Instanzmitglied gehört, so dass ich bestimmen kann, ob es kompiliert werden soll oder nicht, um seinen Wert zu erhalten oder den Ausdruck in eine benutzerdefinierte SQL-Funktion zu konvertieren. Schwer zu erklären, alles im Detail mit begrenztem Raum –
oscilatingcretin