Ich habe ein paar Klassen, die ich nicht ändern kann. Sie haben eine Eigenschaft Prop3
gemeinsam:
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%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):
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
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:
Weil es eine ungültige Besetzung ist. c1
implementiert nicht die Schnittstelle ic
:
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%