2016-04-11 8 views
1
public DerivedClass : BaseClass 
{ 
    // code 
} 

DerivedClass B = (DerivedClass)MethodReturnsBaseClassObject(); 
B.DoWork(); 

Es gibt viele abgeleitete Klassen, die von BaseClass geerbt werden. Also jedes Mal, wenn ich eine neue Methode schreiben muss, um einige der Eigenschaften zu verwenden.Umwandeln des abgeleiteten Klassentyps in den Basistyp C#

Ist dies möglich, dass mit Reflektion machen wir DerivedClass Typ dynamisch und tun so etwas und machen es generisch.

System.Type type = GetRequestFromSession().GetType(); 
type B = (type)MethodReturnsBaseClassObject(); 
Console.WriteLine(B.Name); 
Console.WriteLine(B.Age); 

jede Hilfe wird geschätzt.

+0

Haben Sie dynamische Typen in Betracht gezogen: https://msdn.microsoft.com/en-us/library/dd264736.aspx oder ExpandoObject https://msdn.microsoft.com/en-us/library/system.dynamic. expandoobject (v = vs.110) .aspx? Hier ist auch ein msdn Blog zum Thema: https://blogs.msdn.microsoft.com/csharpfaq/2009/09/30/dynamic-in-c-4-0-introducing-the-expandoobject/ –

+0

Ich nehme an Sie kann 'Name' und' Age' nicht einfach auf 'BaseClass' deklarieren, oder? – HimBromBeere

Antwort

3

Das fühlt sich für mich wie ein schlechter Entwurf an: Sie machen etwas Generisches, das Sie als etwas verwenden, das nicht ist. Vielleicht solltest du dein Design überdenken.

Für Ihre Frage können Sie möglicherweise eine Proxy-Methode oder -Klasse erstellen, die den von Ihnen erwarteten Typ zurückgibt. Dies ist nur nützlich, wenn die Anzahl der aufgerufenen Methoden gering ist.

Eine weitere Option ist die Verwendung des Schlüsselwortes dynamic, aber ich würde nur empfehlen, das zu verwenden, wenn nichts anderes funktioniert.

+0

Ich kenne es ein sehr schlechtes Design. Aber ich muss es generisch machen. Es gibt 34 identische Methoden in der gesamten Anwendung geschrieben. Ich möchte eine Methode für bessere Wartung in Zukunft machen –

+0

Danke Patrick. Die Verwendung von dynamischen mit diesem Design hat es behoben ... Aber Entschuldigung über schlechtes Design Ich arbeite gerade an dieser Anwendung. –

4

können Sie haben einen sicheren Zugang zu Mitgliedern des abgeleiteten Typ (ohne Abgüsse), während die Basisklasse Einschränkung erzwingen, wenn Sie eine generische Methode mit folgender Signatur verwenden:

public TDerived MethodReturnsDerivedObject<TDerived>() 
    where TDerived : BaseClass 

Ihre Anrufe wie folgt aussehen dann :

DerivedClass b = MethodReturnsDerivedObject<DerviedClass>(); 

b.ExecuteSomeMethodDefinedInBaseClass(); 

Console.WriteLine(b.SomePropertyDefinedInDerivedClass); 
+0

Das ist viel besser als dynamische IMO. – moarboilerplate

+0

Yeh, so etwas mit Generika wäre der Weg zu gehen. – Magnus

+0

Dies wird eine häufige Implementierung für viele abgeleitete Typen sein. Ich habe dynamisch verwendet, weil ich bei der Verwendung von 'dynamic' mein Design nicht ändern muss. Aber dazu muss ich zuerst den Typ der abgeleiteten Klasse kennen. –

2

Ich würde mit Kirill Shlenskiys Antwort für jetzt gehen. Aber ich würde auch vorschlagen, diese Methode auf die Basisklasse selbst zu verschieben , wenn es sinnvoll ist, dies zu tun. Es kann zu verschlungenen Abhängigkeiten oder anderen Seltsamkeiten kommen, die diese Lösung verbieten, aber es kann Ihnen auch erlauben, einen Verbraucher ohne Generika zu haben.

Verwandte Themen