2009-08-20 5 views
1

Ich versuche, den umgekehrten Weg von dem zu gehen, was Sie normalerweise tun würden.Konvertieren von Basisobjekt in inherrited Objekt

Ich habe zwei POCO-Klassen A und B, wobei B von A inherrits

public class A 
{ 
    public int Foo { get; set; } 
} 

public class B : A 
{ 
    public int Bar { get; set; } 
} 

B ment als Erweiterung zu A mit zusätzlichen Informationen.

Ich beginne mit einer Instanz der Klasse mit A

A a = new A { Foo = 1 }; 

Und dann mag ich die Informationen in der Klasse A mit den Zusatzinformationen erweitern und die letzte Klasse B. bekommt ich jede Eigenschaft von Klasse-A-Karte könnte

A a = new A { Foo = 1 }; 
B b = new B { Foo = a.Foo, Bar = 2 }; 

Oder in Konstruktor

A a = new A { Foo = 1 }; 
B b = new B(a) { Bar = 2 }; // Mapping of value Foo is done in constructor of object B 
: auf die Eigenschaft in der Klasse B, aber es viel Sinn für mich nicht machen

Das Ergebnis ist in jedem Fall eine manuelle Zuordnung der Werte von Objekt A nach B. Es muss einen klügeren Weg geben, dies zu tun ... irgendwelche Vorschläge?

Antwort

0

A. instanziiert Wenn Sie tatsächlich Typen zu ändern (und nicht Guss) - Wenn Sie nur ein paar Klassen haben, dann schreiben Sie einfach den Conversion-Code - vielleicht einen Ctor für B, der eine Vorlage A akzeptiert. Wenn Sie viele Klassen haben ... gibt es Tricks, die Sie entweder mit dynamischem Code oder mit Serialisierung machen können. PropertyCopy in MiscUtil wird dies tun, zum Beispiel (ein dynamisches Expression mit der Arbeit sehr schnell zu tun):

A a = new A { Foo = 1 }; 
B b = PropertyCopy<B>.CopyFrom(a); 
b.Bar = 2; 
+0

Marc, ich mag deinen Vorschlag zur Reflexion. Der Gedanke kam mir in den Sinn, aber ich wollte keine Eigenschaft kopieren. Danke für den Link zu MiscUtil. Es hat mir wertvolle Zeit gespart. –

0

Ich würde die „intelligente“ Art und Weise betrachtet, wie Ihr letzter Vorschlag sein - eine Kopie Konstruktor für B schreiben, der weiß, wie man sich von einem

+0

IMHO, die zu einem maintainaince Alptraum führen könnten. Das Beispiel ist extrem vereinfacht. Für meine aktuelle Implementierung verwende ich den letzten Vorschlag. –