2009-11-17 5 views
2

La classe à instancier:Créer une instance d'un type, à condition en tant que paramètre à une méthode

public class InstantiateMe 
{ 
    public String foo 
    { 
     get; 
     set; 
    } 
} 

Certains pseudo-code:

public void CreateInstanceOf(Type t) 
{ 
    var instance = new t(); 

    instance.foo = "bar"; 
} 

Jusqu'à présent, je suis en pensant que je dois d'utiliser la réflexion pour y arriver, étant donné la nature dynamique de ce que je veux réaliser.

Voilà mes critères de réussite de:

  • Créer une instance de tout type
  • Créer des instances de types sans avoir à invoquer leur constructeur
  • Accédez à toutes les propriétés publiques

Je serais très apprécier un exemple de code de travail. Je ne suis pas nouveau à C#, mais je n'ai jamais travaillé avec la réflexion avant.

Répondre

4

Vous auriez essentiellement besoin d'utiliser la réflexion. Utilisez Activator.CreateInstance() pour construire votre type puis appelez InvokeMember() le type, pour définir la propriété:

public void CreateInstanceOfType(Type t) 
{ 
    var instance = Activator.CreateInstance(t); // create instance 

    // set property on the instance 
    t.InvokeMember(
     "foo", // property name 
     BindingFlags.SetProperty, 
     null, 
     obj, 
     new Object[] { "bar" } // property value 
    ); 
} 

Pour accéder à toutes les propriétés du type générique et définir/les obtenir, vous pouvez utiliser GetProperties() qui retourne une collection PropertyInfo , que vous pouvez itérer:

foreach (PropertyInfo property in type.GetProperties()) 
{ 
    property.GetValue() // get property 
    property.SetValue() // set property 
} 

aussi, voir the documentation pour plus de façons d'utiliser InvokeMember().

+0

Docs et Intellisense ne font rien pour moi. Pourriez-vous me fournir un code de travail? – roosteronacid

+0

Modifié en conséquence. –

+0

@Wim: 'Activator.CreateInstance (T)' ne fonctionne pas lorsque j'essaie d'instancier une classe sans paramètre. Des idées? – roosteronacid

4

Procédez comme suit pour créer l'instance.

Object t = Activator.CreateInstance(t); 

Il est impossible cependant, sans contraintes génériques et d'accéder statiquement les membres comme indiqué dans votre exemple.

Vous pouvez le faire avec les éléments suivants si

public void CreateInstanceOf<T>() where T : InstantiateMe, new() 
{ 
    T i = new T(); 
    i.foo = "bar"; 
} 
+0

;-) –

+0

Il doit être T ins = Activator.CreateInstance (); – Gonzalo

+0

@Wim, Gonzalo, merci. Correction de l'utilisation de la méthode CreateInstance non générique. – JaredPar

0

Puisque vous avez le type que vous voulez instancier, vous pouvez utiliser une méthode d'assistance générique pour que:

 
public static T New() where T : new() 
{ 
    return new T(); 
} 

Sinon, si vous tirez sur le type de quelque part ailleurs (comme un ensemble dynamique chargé) et vous n'avez pas accès au type directement (c'est une sorte de méta-programmation ou de données réfléchies) vous devriez utiliser la réflexion. Ce qui serait: T obj = Activator.CreateInstance ();

Questions connexes