Hinweise zu C # Expression Trees

c# expression-trees reflection

Frage

Ich arbeite an einer Methode, die einen Ausdrucksbaum als Parameter akzeptiert, zusammen mit einem Typ (oder einer Instanz) einer Klasse.

Die Grundidee ist, dass diese Methode bestimmte Dinge zu einer Sammlung hinzufügen wird, die für die Validierung verwendet wird.

public interface ITestInterface
{
    //Specify stuff here.
}

private static void DoSomething<T>(Expression<Func<T, object>> expression, params IMyInterface[] rule)
{
    // Stuff is done here.
}

Die Methode wird wie folgt aufgerufen:

public interface ITestInterface
{
    //Specify stuff here.
}

private static void DoSomething<T>(Expression<Func<T, object>> expression, params IMyInterface[] rule)
{
    // Stuff is done here.
}

Ich mache es auf diese Weise, weil ich möchte, dass die Eigenschaftsnamen, die übergeben werden, stark typisiert sind.

Ein paar Dinge, mit denen ich Probleme habe ..

  1. Innerhalb von DoSomething möchte ich einen PropertyInfo Typ (aus dem übergebenen Körper) von T erhalten und ihn zusammen mit der Regel [] zu einer Sammlung hinzufügen. Zur Zeit denke ich darüber nach, expression.Body zu verwenden und [propertyname] aus "Convert. ([Propertyname])" zu entfernen und Reflektionen zu verwenden, um zu bekommen, was ich brauche. Dies scheint umständlich und falsch. Gibt es einen besseren Weg?
  2. Ist das ein bestimmtes Muster, das ich verwende?
  3. Zu guter Letzt sind alle Vorschläge oder Erklärungen zu meinem Missverständnis meiner Arbeit geschätzt und / oder Ressourcen oder gute Informationen über C # -Ausdrucksbäume werden ebenfalls geschätzt.

Vielen Dank!

Ian

Bearbeiten:

Ein Beispiel dafür, was expression.Body.ToString() in der DoSomething-Methode zurückgibt, ist eine Zeichenfolge, die "Convert (t.MyProperty)" enthält, wenn sie im obigen Beispiel aufgerufen wird.

Ich brauche es stark typisiert, so dass es nicht kompiliert wird, wenn ich einen Eigenschaftsnamen ändere.

Danke für die Vorschläge!

Akzeptierte Antwort

Das Sammeln von PropertyInfo-Objekten aus Expression.Body ähnelt meiner Lösung einer anderen Frage.


Beliebte Antwort

Ich bin stark auf Ausdrucksbäume angewiesen, um viel von dem, was ich mit meiner aktuellen Anwendung machen möchte, auf die Kompilierzeit, dh die statische Typprüfung, zu schieben.

Ich durchquere Ausdrucksbäume, um sie in etwas anderes zu übersetzen, das "einen Sinn ergibt".

Eine Sache, die ich am Ende getan habe, ist, dass statt URLs ich auf einen MVC-ähnlichen Ansatz angewiesen bin, wo ich Lambda-Funktionen deklariere und das übersetzt ... interpretiere, der Compiler erzeugte Ausdrucksbaum in eine URL. Wenn diese URL aufgerufen wird, mache ich das Gegenteil. Auf diese Weise habe ich das, was ich Compile-Time-Checks für defekte Links nenne, und das funktioniert auch gut mit Refactoring und Überladungen. Ich denke, es ist cool darüber nachzudenken, Expression-Bäume auf diese Weise zu verwenden.

Vielleicht möchten Sie sich das Besuchermuster ansehen, es ist ein Schmerz, mit dem Sie anfangen sollten, weil es am Anfang nicht viel Sinn ergibt, aber es verbindet alles miteinander und es ist eine sehr formale Art, die Typüberprüfung in der Compilerkonstruktion zu lösen. Sie könnten das gleiche tun, aber anstelle der Typüberprüfung emittieren, was immer Sie brauchen.

Etwas, gegen das ich mich derzeit stoße, ist die Fähigkeit, ein einfaches Framework zu erstellen, um Ausdrücke zu übersetzen (oder eigentlich sollte ich sagen, interpretieren) und JavaScript ausstrahlen. Die Idee ist, dass die vom Compiler erzeugten Ausdrucksbäume in gültiges JavaScript umgesetzt werden, das mit einem Objektmodell verbunden ist.

Das Spannende daran ist, dass der Compiler mir immer sagen kann, wenn ich falsch liege und sicher bin, dass das Endergebnis nur ein Haufen Strings ist, aber der wichtige Teil ist, wie diese Strings erstellt wurden. Sie haben eine Überprüfung durchlaufen und das bedeutet etwas.

Sobald du das hinbekommst, gibt es wenig, was du mit Ausdrucksbäumen nicht tun kannst.

Während ich mit dem System.Reflection.Emit-Zeug gearbeitet habe, habe ich mit Hilfe von Ausdrucksbäumen ein leichtgewichtiges Framework für die dynamische Kompilierung erstellt, das zur Kompilierungszeit im Grunde sagen könnte, ob meine dynamisch erstellten Assemblies auch kompilieren würden und dies nahtlos mit Reflektion funktionierte und statische Typprüfung. Es nahm dies immer weiter und endete mit etwas, was am Ende viel Zeit gespart hat und sich als sehr wendig und robust erwiesen hat.

Also ich liebe diese Art von Sachen, und das ist es, was Meta-Programmierung dreht sich um das Schreiben von Programmen in Ihren Programmen, die Programme tun. Ich sage weiter so!




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