2008-11-24 7 views
14

Comment utiliser la réflexion pour créer une liste générique avec une classe personnalisée (Liste <CustomClass>)? Je dois pouvoir ajouter des valeurs et utiliser propertyInfo.SetValue(..., ..., ...) pour le stocker. Serais-je mieux de stocker ces List <> comme une autre structure de données?Utilisation de Reflection pour définir une propriété avec un type de liste <CustomClass>

Edit:

J'ai précisé que l'objet est plus comme ça, mais la réponse de Marc Gravell fonctionne toujours.

class Foo 
{ 
    public List<string> Bar { get; set; } 
} 
+0

est vraiment une classe personnalisée? J'espérais que vous parliez de quelque chose comme utiliser la réflexion pour invoquer une classe MyClass qui a une propriété qui est une liste où SomeOtherClass est une classe que j'ai faite qui a un tas de propriétés et de constructeurs etc ... – topwik

+0

Ok , donc la chaîne était un mauvais choix pour une classe, mais cela suffisait comme explication. On peut remplacer la chaîne avec à peu près n'importe quelle classe en ce qui concerne ma connaissance limitée, mais dans le cas que je demandais, la classe et le type dans la liste sont trouvés par réflexion seulement. – dragonjujo

Répondre

19
class Foo 
{ 
    public string Bar { get; set; } 
} 
class Program 
{ 
    static void Main() 
    { 
     Type type = typeof(Foo); // possibly from a string 
     IList list = (IList) Activator.CreateInstance(
      typeof(List<>).MakeGenericType(type)); 

     object obj = Activator.CreateInstance(type); 
     type.GetProperty("Bar").SetValue(obj, "abc", null); 
     list.Add(obj); 
    } 
} 
+0

et si j'ai classe Foo { public liste bars {get; set;} } class Bar { octet public Id {get; ensemble; } octet public Statut {obtenir; ensemble; } public byte Type {get; ensemble; } public Bar() {} } J'instancie foo en utilisant la réflexion, activator.createinstance(). Maintenant, j'ai besoin de remplir cette liste de barres avec des objets Bar. – topwik

+0

devrait compiler le code que vous avez là? On me dit que je dois encore fournir la déclaration de l'IList avec un type ... IList ou quelque chose, je ne sais pas? – topwik

+0

Je peux faire var list = Activator.CreateInstance (typeof (Liste <>). MakeGenericType (GetListType (p.ParameterType))); Mais je ne semble pas obtenir une liste en retour puisque la liste ne semble pas avoir une méthode Add ... – topwik

1

Voici un exemple de prendre le type Liste < > et le transformer en liste < chaîne >.

var liste = typeof (Liste < >) .MakeGenericType (typeof (chaîne));

+0

Cela ne vous donne pas une liste d'aucune sorte - il vous donne un type –

Questions connexes