c # Iterate Array des übergeordneten Typs, um eine nicht-polymorphe Methode für den abgeleiteten Typ aufzurufen

8

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:

%Vor%

Somit deklariere ich einen Delegaten innerhalb der Schleife, der ein MemberInfo übernimmt und den Wert dieses Mitglieds als Objekt zurückgibt:

%Vor%

Die Frage

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?

%Vor%

Alternativ könnte ich den Typ bei jeder Iteration erkennen, aber sollte kein Grund sein, warum einzelne Array-Mitglieder sich jemals unterscheiden:

%Vor%     
Kevin P. Rice 04.04.2012, 19:53
quelle

5 Antworten

2

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%     
Ian Mercer 04.04.2012, 20:34
quelle
1

Sie sollten Generika verwenden:

%Vor%

Testen Sie im Inneren, was T ist, und entscheiden Sie anhand dessen, welche Methode Sie aufrufen möchten:

%Vor%

Sie können die Überprüfung natürlich nur einmal und nicht bei jeder Wiederholung durchführen.

    
zmbq 04.04.2012 20:03
quelle
1

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%     
Steve Czetty 04.04.2012 20:54
quelle
0

Versuchen Sie Folgendes:

%Vor%

areProperties wird nur dann wahr sein, wenn alle Elemente im members[] -Array PropertyInfo-Objekte sind.

    
Keith 04.04.2012 20:06
quelle
0

Sie können so etwas tun, wenn Sie C# 4.0

verwenden %Vor%

Code wird sehr kurz und unkompliziert. Sollte funktionieren.

Viel Glück

    
Tigran 04.04.2012 20:22
quelle

Tags und Links