Interface Casting

7

Ich habe ein paar Klassen, die ich nicht ändern kann. Sie haben eine Eigenschaft Prop3 gemeinsam:

%Vor%

Nun möchte ich auf diese Eigenschaft zugreifen, ohne den Typ zu kennen. Ich dachte an ein Interface:

%Vor%

Dieser Code löst jedoch eine ungültige Ausnahme aus:

%Vor%     
Dr. Snail 19.08.2016, 11:57
quelle

5 Antworten

11

C # unterstützt keine Enttippung zur Kompilierungszeit. Wenn Sie also Ihre Typen nicht ändern können, nein Glück dabei.

Sie können auf Ihre Eigenschaft zugreifen, indem Sie dynamic verwenden, wodurch die Eingabe von Runtime-Entchen möglich ist (keine Überprüfung der Kompilierungszeit und Sie verlieren intellisense, wenn Sie Visual Studio verwenden):

%Vor%

Oder durch Reflexion:

%Vor%

Da es keine Überprüfung der Kompilierungszeit gibt, müssen Sie Ausnahmen behandeln, falls Sie eine Instanz ohne Prop3 übergeben.

Wenn die Typen nicht versiegelt sind, können Sie versuchen, eigene abgeleitete Typen zu implementieren, bei denen Sie eine Schnittstelle angeben können:

%Vor%

Dies würde erfordern, dass Sie die Erstellung der Instanzen steuern, Instanzen müssen jedoch vom Typ c1d , c2d , c3d sein, funktionieren nicht, wenn Sie Objekte vom Typ c1 ,% co_de erhalten % oder c2

Sie können explizite Typumwandlungen vornehmen, wie @David aufzeigt (was ein cleverer Trick ist), aber das bedeutet, dass Sie zwei Instanzen Ihres Objekts haben. Für einen sehr einfachen Fall wie den, der in der Frage präsentiert wird, könnte es ... wenn Sie etwas fortgeschritteneres brauchen, das könnte ziemlich schwierig sein

    
Jcl 19.08.2016, 12:00
quelle
7

Verwenden Sie eine adapterähnliche Konstruktion, um die Konvertierungslogik einzukapseln. Natürlich ist der Nachteil, dass Sie die Klasse ändern müssen, wenn c4 erscheint.

%Vor%

Verwendung:

%Vor%     
Maarten 19.08.2016 12:15
quelle
3

Eine andere Möglichkeit, dies zu erreichen, ist die Verwendung der Reflektion, um den Wert der Eigenschaft mit einem angegebenen Namen zu erhalten.

Schreiben Sie beispielsweise eine einfache Hilfsmethode wie folgt:

%Vor%

Dann gegeben die folgenden nicht verwandten Klassen:

%Vor%

Sie können auf die Eigenschaften Prop3 wie folgt zugreifen:

%Vor%     
Matthew Watson 19.08.2016 12:43
quelle
1

Weil es eine ungültige Besetzung ist. c1 implementiert nicht die Schnittstelle ic :

%Vor%

Um zu werfen, müssten die Objekte rechtmäßig polymorph sein:

%Vor%

Aber wenn Sie wirklich die Klasse in keiner Weise ändern können, dann sind die Typen nicht polymorph und haben keine Beziehung zueinander. Um von einem zum anderen zu wechseln, müssten Sie manuell konvertieren:

%Vor%

Das Beispiel ist natürlich sehr erfunden. Aber du hast die Idee. Zwei völlig unverwandte Typen können nicht von einem zum anderen übertragen werden. Sie müssten sie konvertieren.

Sie können diese Umwandlung jedoch auf verschiedene Arten einkapseln. Eine Hilfsmethode, eine Factory, sogar ein expliziter Konvertierungsoperator (der die von Ihnen ursprünglich versuchte Konvertierung zulässt)

%Vor%     
David 19.08.2016 12:05
quelle
1

Anstatt sich mit Reflektion / Dynamik und den Fallstricken darin zu befassen, könnte Ihre Methode leicht in drei Überladungen aufgeteilt werden:

%Vor%

Downside ist ein bisschen wiederholten Code, aber die Oberseite ist keine Ausnahmen und Kompilierzeit Typprüfung.

    
DavidG 19.08.2016 12:11
quelle

Tags und Links