2009-12-16 6 views
1

Je souhaite créer une instance de n'importe quelle classe de manière générique. est-ce possible? Je sais, c'est follement mais c'est seulement une question attend sa réponse.Création d'une classe C# par voie générique

J'ai essayé ceci mais ne fonctionne pas.

public class blabla { 
public void bla(); 
} 

public class Foo<T> 
{ 

     Dictionary<string, Func<object>> factory; 

     public Foo() 
     { 
      factory = new Dictionary<string, Func<object>>(); 
     } 

     public WrapMe(string key) 
     { 

      factory.Add(key,() => new T()); 

     } 
} 

Foo<blabla> foo = new Foo<blabla>(); 
foo.Wrapme("myBlabla"); 
var instance = foo.factory["myBlabla"]; 
instance.Bla(); 

Répondre

2

Vous avez seulement besoin d'une méthode:

static T InstantiateInstance<T>() where T : new() 
{ 
    return new T(); 
} 
4

Il y a deux façons de résoudre ce:

Variante 1: Ajouter where T : new() à votre définition de la classe:

public class Foo<T> where T : new() 
{ 
    ... 
} 

Pour plus de détails, voir la description de the new() constraint.


Variante 2: Faire passer le lambda () => new T() comme paramètre à votre constructeur, le stocker dans un champ Func<T> et l'utiliser dans WrapMe.

Pour plus de détails, voir this blog post

0

Vous devez utiliser la nouvelle contrainte lors de la déclaration Foo. Cela ne fonctionne que pour les types avec un constructeur sans arguments - ce qui est bien dans votre cas.

2

Vous pouvez utiliser Activator.CreateInstance<T>().

+0

Oui, mieux que mon approche. – grenade

+0

@grenade - identique à votre approche. La seule différence est que votre approche échouera au moment de la compilation, l'approche de Diego échouera au moment de l'exécution –

+0

@Krzysztof Koźmic, attention à élaborer? Les deux approches se compilent et fonctionnent bien ici. – grenade

Questions connexes