Ich verwende sehr ähnliche Schleifen, um alle öffentlichen Felder und Eigenschaften jedes übergebenen Objekts zu iterieren. Ich bestimme, ob das Feld / die Eigenschaft mit einem bestimmten benutzerdefinierten Attribut versehen ist. Ist dies der Fall, wird eine Aktion für den Wert des Felds oder der Eigenschaft ausgeführt. Zwei Schleifen sind erforderlich, da die Methode zum Abrufen eines Feldwerts sich von der Methode zum Abrufen eines Eigenschaftswerts unterscheidet.
%Vor%Ich möchte die Schleife in eine einzige, gebräuchliche Methode einfügen, damit ich stattdessen einfacher schreiben kann:
%Vor% Dies erfordert DoEachMember()
, um den Typ MemberInfo
zu akzeptieren (was der übergeordnete Typ von FieldInfo
und PropertyInfo
ist). Das Problem ist, dass es keine Methode GetValue
in der Klasse MemberInfo
gibt. Sowohl FieldInfo
als auch PropertyInfo
verwenden verschiedene Methoden, um den Feld / Eigenschaftswert zu erhalten:
Somit deklariere ich einen Delegaten innerhalb der Schleife, der ein MemberInfo
übernimmt und den Wert dieses Mitglieds als Objekt zurückgibt:
Wie kann ich den Typ der Objekte im Array members[]
erkennen, um den innerhalb der Schleife verwendeten Delegaten zu definieren? Momentan verwende ich das erste Element des Arrays, members[0]
. Ist das ein gutes Design?
Alternativ könnte ich den Typ bei jeder Iteration erkennen, aber sollte kein Grund sein, warum einzelne Array-Mitglieder sich jemals unterscheiden:
%Vor%Sie könnten zuerst auf die Objektwerte projizieren und dann an denen in Ihrer Schleife arbeiten. Ihr ganzer Code könnte dazu (plus Ihre Schleife) herunterkochen:
%Vor%Ihr derzeitiger Code mischt zwei Anliegen: die Werte finden und etwas damit machen. Es wäre sauberer, diese Bedenken zu trennen. Der obige LINQ könnte in einer Methode platziert werden, die alle Werte von einer Klasse abruft, die in Feldern oder Eigenschaften sind, die einem bestimmten Attribut entsprechen, und eine andere als nur eine Schleife, die die Arbeit an was auch immerem übergeben wird.
Nicht so sauber, aber mit Ihrem ursprünglichen Ziel klebend, können Sie dies tun und einen Delegierten übergeben, der dem Typ der MemberInfo entspricht, die Sie abrufen: -
%Vor%Ich habe mich diesem Thema genähert, indem ich MemberInfo in einer Schnittstelle wie folgt eingebunden habe:
%Vor%Und eine Fabrik:
%Vor%Da können Sie in Ihrer Methode:
%Vor%Tags und Links c#