Comment créer une Liste<T> exemple de fichier C# à l'aide de la Réflexion
SALUT,
J'ai une exigence de créer un exemple de liste d'objet lors de l'exécution à l'aide de la réflexion. Par exemple, j'ai 2 classes comme ci-dessous,
class Class1
{
List<Class2> class2List;
public List<Class2> Class2List
{
get;set;
}
}
class Class2
{
public string mem1;
public string mem2;
}
Après la création de l'instance de Class1
à l'Exécution dans une autre classe Class3
, je veux assigner des valeurs de toutes les propriétés de la classe. Dans ce cas, Class2List
est une propriété de List<Class2>
. Au moment de l'Exécution, je ne sais pas le type de classe de List<Class2>
. Comment puis-je initialiser la propriété c'est à dire List<Class2>
à l'intérieur de class3 au moment de l'exécution.
Toutes les suggestions sont grandement appréciés...
OriginalL'auteur Ananya | 2011-05-06
Vous devez vous connecter pour publier un commentaire.
Plutôt que de remettre en question vos motivations ou d'essayer de détricote ce que vous êtes en train de faire - je vais juste répondre à la question dans le titre.
Donné que vous avez une instance de type
listElemType
qui représente le type de l'argument qui est passée à laList<>
de type à l'exécution:Et puis vous pouvez travailler avec la liste par le biais de
IList
l'implémentation de l'interface.Ou, en effet, vous pouvez vous arrêter à la
MakeGenericType
appel et d'utiliser le type qu'il génère dans un appel àActivator.CreateInstance
- comme dans le livre de Daniel Hilgarth de réponse.Alors, étant donné un
target
objet dont la propriété que vous souhaitez définir:Si vous ne connaissez pas les propriétés du type représenté par
target
, alors vous devez utiliserpour obtenir toutes les propriétés publiques de cette instance. Cependant, juste être capable de créer une instance de liste n'est pas vraiment va être en mesure de vous aider là - bas, vous devez avoir un plus solution générique qui peut faire face à n'importe quel type. Sauf si vous allez être spécifiquement cibler des types de liste.
Me semble que vous pourriez avoir besoin d'une interface commune ou de la base de...
Type.EmptyTypes
pour GetConstructor, et passernull
à Invoquer. Aussi, vous allez avoir à jeter de l'objet renvoyé par Invoke:var listInstance = (IList)(typeof(List<>) .MakeGenericType(listElemType) .GetConstructor(new Type[0]) .Invoke(new object[0]));
merci - je savais à propos de
Type.EmptyTypes
et lanull
àInvoke
mais je viens de frapper très rapidement... Le manque de fonte, cependant, c'était parce que je pensais que sur l'ajout de la IList peu après que j'ai wrriten le code! Sera mise à jour.tout comme ce que je suis à la recherche d'
OriginalL'auteur Andras Zoltan
Pourquoi avez-vous besoin pour utiliser la réflexion pour définir la propriété?
Après avoir créé l'instance de
Class1
vous pouvez simplement définir la propriété:OriginalL'auteur Daniel Hilgarth
Ici un exemple de (sans gestion d'erreur!) qui initialise la Liste des biens de Class1.
Que voulez-vous remplir/initialiser dans une propriété/domaine de votre objet si vous disposez d'une interface?
Que voulez-vous remplir pour d'autres types d'objet (peut-être avec plus de 1 constructeur de paramètre)?
Peut-être une inversion de contrôle conteneur de vous servir de votre solution
(comme par exemple Ninject http://ninject.org/, Spring.Net http://www.springframework.net/, l'Unité http://unity.codeplex.com/) ou les membres sont déjà initialisé correctement dans les objets que vous utilisez.
OriginalL'auteur Raffael Zaghet