Ajout dynamique d'éléments à une liste & lt; T & gt; à travers la réflexion
Permet de dire que j'ai cette classe
class Child {
public string FirstName { get; set; }
public string LastName { get; set; }
}
class Container {
public List<Child> { get; set; }
}
Je suis en train de travailler sur un deserializer de toutes sortes et je veux être en mesure de créer et de remplir la Child
liste de données récupérées. J'ai reçu ce jour (j'ai coupé beaucoup de manipulation pour les autres types, pour cet exemple, de sorte que ses inutilement "douteuses", mais garder avec moi):
var props = typeof(Container).GetProperties();
foreach (var prop in props) {
var type = prop.PropertyType;
var name = prop.Name;
if (type.IsGenericType) {
var t = type.GetGenericArguments()[0];
if (type == typeof(List<>)) {
var list = Activator.CreateInstance(type);
var elements = GetElements();
foreach (var element in elements) {
var item = Activator.CreateInstance(t);
Map(item, element);
//??? how do I do list.Add(item) here?
}
prop.SetValue(x, list, null); //x is an instance of Container
}
}
}
Je peux pas comprendre comment le cast list
essentiellement List<t.GetType()>
afin que je puisse accéder à la méthode add et ajoutez l'élément.
source d'informationauteur John Sheehan
Vous devez vous connecter pour publier un commentaire.
Je dirais que vous devriez jeté à
System.Collections.IList
appeler directement la méthode Add. Avantages: simple, pas de laide de réflexion. Inconvénients: les causes de boxe pour les Listes contenant des types de valeur.Cela devrait fonctionner, sauf si je suis vraiment en manque de quelque chose.
À l'extérieur de la boucle
L'intérieur de la boucle
Vous devez appeler
type.MakeGenericType(type.GetGenericArguments())
qui sera de retour le bon fermée de type générique. Vous devez reflectively appeler leAdd
méthode. Le code devrait ressembler à quelque chose comme ceci:Je ne suis pas sûr de ce que vous pouvez utiliser comme
instance
mais ceci est l'objet sur lequel la méthode sera invoquée.La meilleure question à se poser est pourquoi essayez-vous de le faire? L' .NET Framework inclut déjà sérialiseurs savoir les faire tous de ce type de travail. Si vous le pouvez, vous devriez être en utilisant l'un de ceux-ci au lieu d'essayer de "rouler propre".
c'est ce que je fais