Ist es möglich, ein Objekt die Schnittstelle eines Typparameters verfügbar zu machen?

8

In C # ist es möglich, etwas wie folgt zu schreiben:

%Vor%

Ich weiß, dass die obige Implementierung nicht kompiliert, aber was ich eigentlich zu erreichen versuche, ist die Implementierung einer Art generischen Wrapper zu einem unbekannten Typ, so dass ein Client den Wrapper so aufrufen kann, wie er den angegebenen Typ nennen würde durch den Parameter T , anstatt es mit etwas wie wrapper.Instance.SomeMember() aufzurufen.

Vielen Dank im Voraus!

    
Carsten 25.01.2013, 10:47
quelle

2 Antworten

4

Dies ist nicht möglich.

Meiner Meinung nach sollte ein Wrapper nicht durch Vererbung implementiert werden.

Nehmen wir zum Beispiel an, wir haben eine Klasse Engine und Sie müssen eine FerrariEngine implementieren. Und Sie haben eine Klasse Car .

Sie sagen, dass Car FerrariEngine erben soll. Es sieht schrecklich für mich aus!

Am Ende des Tages möchten Sie so etwas wie die Injektion von Abhängigkeiten unter Verwendung von Vererbung tun, und das ist wiederum nicht der richtige Weg.

Mein Vorschlag ist versuchen Sie nicht, Ihr Leben einfacher zu machen : Entscheiden Sie sich für eine Architektur, die auf rationalen Punkten basiert.

AKTUALISIEREN

Das OP sagte in einem Kommentar:

  

Ich möchte diese Klasse dazu bringen, Instanzen von Objekten vom Typ T zu verwalten   dass der Client sich nicht darum kümmern muss, wenn die Instanzen es benötigen   erstellt werden.

Sie müssen keine seltsamen Dinge machen, um zu bekommen, was Sie wollen:

%Vor%

Schließlich, wenn wir eine Instanz von FerrariCar erstellen:

%Vor%

Die Engine wird ohne Entwicklereingriff instanziiert und gestartet!

Überprüfen Sie, wie Lazy<T> und grundlegende generische Einschränkungen den Job machen;)

Zusammenfassend:

  • Mit Lazy<T> wird die Engine nur instanziiert, wenn einige auf die Engine -Eigenschaft zugreifen.
  • Sobald die Lazy-Loaded-Engine instanziiert wird, wird% %_country% einen parameterlosen Konstruktor implementieren, der FerrariEngine selbst aufruft und die Engine startet.

Ich glaube, dieses Beispiel zeigt Ihnen, wie Sie das bekommen, wonach Sie suchen und C # "wie es ist" verwenden!

    
Matías Fidemraizer 25.01.2013, 11:11
quelle
1

Sie können sich DynamicObject ansehen und so etwas tun:

%Vor%     
Erno de Weerd 25.01.2013 11:55
quelle

Tags und Links