C# - Lambda-Ausdrücke oder Delegierten als Eigenschaften oder Argumente
Ich bin auf der Suche zum erstellen einer Gültigkeitsregel-Klasse, überprüft die Eigenschaften einer Entität vom Typ Objekt. Ich würde wirklich gerne, um den Namen der Eigenschaft, um zu überprüfen, und geben Sie der Klasse ein Delegierter oder ein lambda-Ausdruck wird zur Laufzeit ausgewertet, wenn das Objekt führt die IsValid () - Methode. Hat jemand ein snippet, so etwas wie dies, oder irgendwelche Ideen auf, wie übergeben Sie eine anonyme Methode als argument oder Eigentum?
Auch, ich bin mir nicht sicher, ob ich erkläre, was ich bin versucht zu erreichen, also bitte Fragen stellen, wenn ich mich nicht klar ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wirklich, was Sie verwenden möchten, ist
Func<T,bool>
wobei T der Typ des Elements, das Sie überprüfen möchten. Dann würden Sie so etwas tunkönnten Sie lagern Sie Sie in einem
List<Func<T,bool>>
.Dass sollte Ihnen den Einstieg. Aber, wirklich, die Vererbung ist weit mehr angemessen. Das problem ist einfach, dass die
Validator
nicht haben Zugang zu jedem Staat, dass es nicht in der Nähe, über, dies bedeutet, dass es nicht so wiederverwendbar wie sagenValidationRules
enthalten Ihren eigenen Staat. Vergleichen Sie die folgende Klasse, um die Vorherige definition dertextBoxHasText
.Gut, einfach, wenn man eine Entity-Klasse, und Sie möchten, um die Verwendung von lambda-Ausdrücken auf, die Unternehmen bestimmen, ob etwas gültig ist (Rückgabe boolean), könnte man eine Func.
So, da ein Unternehmen:
Könnten Sie eine Gültigkeitsregel-Klasse für die, die wie dieses:
Dann können Sie es wie folgt:
Natürlich, das ist nur eine mögliche Lösung.
Wenn Sie entfernen die generische Einschränkung oben ("wo T : Entity"), Sie könnten dieses eine generische Regel-engine, die verwendet werden könnten, mit jedem POCO. Würden Sie nicht haben, leiten Sie eine Klasse für jede Art der Verwendung, die Sie benötigen. Also, wenn ich wollte mit diesem derselben Klasse in einem Textfeld, die ich verwenden könnte, den folgenden (nach dem entfernen der generische Einschränkung):
Es ist ziemlich flexibel, auf diese Weise. Lambda-Ausdrücke und generics sind zusammen sehr mächtig. Statt zu akzeptieren Func oder Aktion, könnte man akzeptieren, Ausdruck> oder der Ausdruck> und haben direkten Zugang auf die express-Baum automatisch untersuchen, Dinge wie den Namen der Methode oder Eigenschaft, welche Art von Ausdruck es ist, etc. Und Menschen, die mit Ihrer Klasse nicht eine einzige Zeile code.
etwas wie:
wäre mehr C# 3 style, aber kompiliert wird, den gleichen code wie @Frank Krüger seine Antwort.
Dies ist, was Sie gefragt haben, fühlen sich aber nicht Recht. Gibt es einen guten Grund, warum die Entität kann nicht erweitert werden, um die Validierung?
Wäre ein Regel-definition syntax wie diese Arbeit für Sie?
Check-out DDD und regelbezogene UI-Validierung .NET weitere Informationen