2009-08-20 6 views
1

J'essaie d'aller dans le sens inverse de ce que vous feriez normalement.Conversion d'un objet de base en un objet hérité

J'ai deux des classes POCO A et B où B inherrits de A

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

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

B est comme extention ment à A avec des informations supplémentaires.

Je commence par avoir une instance de la classe A

A a = new A { Foo = 1 }; 

Et puis je souhaite étendre les informations en classe A avec les informations supplémentaires et obtenir la dernière classe B. Je pouvais carte tous les biens de la classe A à la propriété dans la classe B, mais il ne fait pas me beaucoup sence:

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

Ou dans le constructeur

A a = new A { Foo = 1 }; 
B b = new B(a) { Bar = 2 }; // Mapping of value Foo is done in constructor of object B 

Le résultat est dans le cas d'une cartographie manuelle des valeurs de l'objet A à B. Il doit y avoir une façon plus intelligente de faire cela ... des suggestions?

Répondre

0

Si vous changez en fait le type (au lieu de coulée) - alors si vous avez seulement quelques classes, alors écrivez juste le code de conversion - peut-être un ctor pour B qui accepte un modèle A. Si vous avez beaucoup de classes ... il y a des astuces que vous pouvez faire avec le code dynamique ou la sérialisation. PropertyCopy à MiscUtil va le faire, par exemple (en utilisant un Expression dynamique pour faire le travail très rapidement):

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

Marc, j'aime ta suggestion d'utiliser la réflexion. La pensée a traversé mon esprit mais je ne voulais pas coder une méthode de copie de propriété. Merci pour le lien vers MiscUtil. Cela m'a fait gagner un temps précieux. –

0

je considère la façon « intelligente » comme votre dernière suggestion - écrire un constructeur de copie B qui sait comment s'instancier d'un A.

+0

à mon humble avis qui pourrait conduire à un cauchemar maintainaince. L'exemple est extrêmement simplifié. Pour ma mise en œuvre actuelle, j'utilise la dernière suggestion. –

Questions connexes