2009-10-16 5 views
0

J'ai une classe public class foubar: fou Comment puis-je obtenir dynamiquement une instance d'une classe de base à partir d'une classe héritée?

a ses propriétés fou et le fait foubar J'ai créé une instance de foubar et des valeurs de consigne à toutes les propriétés, y compris les classes de base. Maintenant j'ai besoin d'une instance de fou qui a les valeurs de propriété qui sont dans foubar. Il est vrai que je pourrais créer une nouvelle instance de fou et écrire du code qui peuplerait cette nouvelle instance à partir d'une instance foubar mais cela signifie que je dois changer de code chaque fois que les propriétés de la classe de base changent.

Je voudrais quelque chose qui fonctionnerait comme celui-ci, où FB est une instance de foubar

test = fou (fou) FB;

Cela "fonctionne" en C#, mais le test est vraiment de type foubar. Je n'ai besoin que de rien, rien d'autre,

Je veux un moyen de renvoyer dynamiquement une instance d'une classe de base remplie à partir de l'instance data/instance de la classe dérivée.

Des idées?

+0

Pourquoi en avez-vous besoin pour * seulement * être la classe de base? –

+0

Pourquoi avez-vous besoin du type réel pour être fou? Cela me semble très "désobéissant" ... –

+0

J'ai une méthode qui ne prend que le type fou, ne prendra pas de foubar. La classe de base fou et la méthode qui prend fou sont hors de mon contrôle. – mike

Répondre

0

Je ne vois pas pourquoi avez-vous besoin d'une telle chose? Mais vous pouvez faire quelque chose comme ceci:

class Foo 
{ 
    // ... 

    public Foo ConcreteFoo() 
    { 
     if (this.GetType().Equals(typeof(Foo))) 
      return this; 
     else 
     { 
      Foo f = new Foo(); 
      // clone properties 
      return f; 
     } 
    } 
} 

Vous pouvez faire:

FouBar foobar = new FooBar(); 
Foo f = foobar.ConcreteFoo(); 

Je suis vraiment pas à l'aise avec ce ... Y at-il une raison particulière pour laquelle vous voulez un béton Foo?

(modifier) ​​

Suite aux commentaires que je peux voir que votre problème est lié à ce question.

0

Vous pouvez utiliser la réflexion et les génériques pour mapper les propriétés nommées entre elles, mais je ne pense pas que vous pouvez changer le type de base d'un objet sans le cloner ou l'instancier.

2

J'ai utilisé la réflexion pour faire dynamiquement une copie des champs de la classe de base. Vous avez obtenu ceci: C# Using Reflection to copy base class properties Maintenant j'ai un vrai type fou que je peux passer à EF.

private fou GetBaseData(foubar FB) 
     { 
      fou test_fou = new fou(); 
      Type type = FB.GetType(); 
      type = type.BaseType; 
      UpdateForType(type, FB, test_fou); 
      return test_fou; 
     } 

     private static void UpdateForType(Type type, foubar source, fou destination) 
     { 
      FieldInfo[] myObjectFields = type.GetFields(
       BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); 

      foreach (FieldInfo fi in myObjectFields) 
      { 
       fi.SetValue(destination, fi.GetValue(source)); 
      } 
     } 
Questions connexes