Ajouter un élément à la Liste Générique / Collection de l'aide de la réflexion
Je veux ajouter un élément à une liste Générique à l'aide de la réflexion. Dans la méthode "DoSomething", je suis en train de terminer la ligne suivante,
pi.PropertyType.GetMethod("Add").Invoke(??????)
mais je reçois des différents types d'erreur.
Ci-dessous mon code complet
public class MyBaseClass
{
public int VechicleId { get; set; }
}
public class Car:MyBaseClass
{
public string Make { get; set; }
}
public class Bike : MyBaseClass
{
public int CC { get; set; }
}
public class Main
{
public string AgencyName { get; set; }
public MyBaseCollection<Car> lstCar {get;set;}
public void DoSomething()
{
PropertyInfo[] p =this.GetType().GetProperties();
foreach (PropertyInfo pi in p)
{
if (pi.PropertyType.Name.Contains("MyBaseCollection"))
{
//Cln contains List<Car>
IEnumerable<MyBaseClass> cln = pi.GetValue(this, null) as IEnumerable<MyBaseClass>;
**//Now using reflection i want to add a new car to my object this.MyBaseCollection**
pi.PropertyType.GetMethod("Add").Invoke(??????)
}
}
}
}
Toutes les idées /suggestions ?
Ce Type est MyBaseCollection? Il est similaire à une Liste<T>? Pas toutes les classes qui implémentent l'interface IEnumerable sont garantis d'avoir une méthode Add.
MyBaseCollection est propre collection de mise en œuvre qui est dérivée à partir de IList<T> , Même réponse pour la Liste<MyBaseClass> devrait résoudre mon problème...
MyBaseCollection est propre collection de mise en œuvre qui est dérivée à partir de IList<T> , Même réponse pour la Liste<MyBaseClass> devrait résoudre mon problème...
OriginalL'auteur kayak | 2011-02-05
Vous devez vous connecter pour publier un commentaire.
Je pense que vous voulez:
Car vous ne savez pas ce que le type d'élément de la collection va être (peut-être pour Voiture, Moto, Cycle, etc.) vous allez trouver qu'il est difficile de trouver un utile exprimés. Par exemple, bien que vous dites de la collection certainement mettre en œuvre
IList<SomeMyBaseClassSubType>
, qui n'est pas du tout utile, carIList<T>
n'est pas covariante. Bien sûr, le casting deIEnumerable<MyBaseClass>
devrait réussir, mais qui ne sera pas vous aider car il ne prend pas en charge les mutations. D'autre part, si votre type de collection mis en œuvre le non-génériqueIList
ouICollection
types de casting pour ceux qui peuvent venir dans maniable.Mais si vous êtes sûr que la collection sera de mettre en œuvre
IList<Car>
(vous savez le type d'élément de la collection à l'avance), les choses sont plus faciles:L'ajout de l'élément de IList sera certainement le travail, mais dans mon cas, j'ai besoin de type de fonte de IEnumerable aps..j'ai une classe de base pour le type générique.. " IList<Voiture> cln = (IList<Voiture>)pi.GetValue(ce, null); " ...de sorte que votre première suggestion travaillé.... (je suis la conversion de ienumerable pour d'autres exigences de codage)
Ques: // (Comment allez-vous faire cela, si vous ne connaissez pas le type d'élément?) Réponse: - je obtenir les valeurs de différentes place dans la hiérarchie des objets...., Ne pas créer de classe dérivée lors de l'exécution..code ci-Dessus est de l'échantillon pour stackoverflow prupose..en temps réel(c'est plus complexe.)
OriginalL'auteur Ani
Comme une alternative... il suffit de ne pas; tenir compte de la non-générique interface IList:
Alors qu'il n'est pas obligatoire pour tous les génériques des collections pour mettre en œuvre IList, qu'ils fassent tous, car elle sous-tend une telle quantité de cadre de base de code.
OriginalL'auteur Marc Gravell
commencer avec
typeof<List<>>.GetMethods
, vous n'avez pas appeler une méthode de la propriété, mais une méthode du type de la propriétéOriginalL'auteur Guillaume86
Pourriez-vous éviter de réflexion de tous ensemble et d'utilisation:
Vous pourriez aussi envisager d'utiliser une interface ou méthodes abstraites...
Vous devriez être en mesure de surmonter cet héritage, personnellement, je pense que l'utilisation de la réflexion serait inutile si les classes et sous-classes ont été structuré correctement.
OriginalL'auteur Rob