J'ai une classe contenant plusieurs propriétés (toutes sont des chaînes si cela fait une différence).
J'ai également une liste, qui contient de nombreuses instances différentes de la classe.
Lors de la création de tests unitaires pour mes classes, j'ai décidé que je voulais parcourir chaque objet de la liste, puis parcourir chaque propriété de cet objet ...
Je pensais que faire cela serait aussi simple que ...
foreach (Object obj in theList)
{
foreach (Property theProperties in obj)
{
do some stufff!!;
}
}
Mais cela n'a pas fonctionné! :( J'obtiens cette erreur ...
"L'instruction foreach ne peut pas fonctionner sur des variables de type 'Application.Object' car 'Application.Object' ne contient pas de définition publique pour 'GetEnumerator'"
Quelqu'un connaît-il un moyen de faire cela sans des tonnes de ifs et de boucles ou sans entrer dans quelque chose de trop complexe?
la source
Réponses:
Essayez ceci:
Veuillez également noter qu'il
Type.GetProperties()
a une surcharge qui accepte un ensemble d'indicateurs de liaison afin que vous puissiez filtrer les propriétés sur un critère différent comme le niveau d'accessibilité, voir MSDN pour plus de détails: Type.GetProperties, méthode (BindingFlags) Dernier point mais non le moindre, n'oubliez pas de ajoutez la référence d'assemblage "system.Reflection".Par exemple pour résoudre toutes les propriétés publiques:
Veuillez me faire savoir si cela fonctionne comme prévu.
la source
Vous pouvez parcourir toutes les propriétés non indexées d'un objet comme ceci:
Puisque
GetProperties()
renvoie des indexeurs ainsi que des propriétés simples, vous avez besoin d'un filtre supplémentaire avant d'appelerGetValue
pour savoir qu'il est sûr de passernull
comme deuxième paramètre.Vous devrez peut-être modifier davantage le filtre afin d'éliminer les propriétés en écriture seule et autrement inaccessibles.
la source
null
getter, mais je suis sûr qu'OP découvrira comment obtenir uniquement les propriétés dont il a besoin.Vous y êtes presque, il vous suffit d'obtenir les propriétés du type, plutôt que de vous attendre à ce que les propriétés soient accessibles sous la forme d'une collection ou d'un sac de propriétés:
De là, vous pouvez accéder comme suit :
Le
GetValue
deuxième paramètre vous permettra de spécifier des valeurs d'index, qui fonctionneront avec les propriétés retournant des collections - puisqu'une chaîne est une collection de caractères, vous pouvez également spécifier un index pour renvoyer un caractère si nécessaire.la source
Bien sûr pas de problème:
la source
if (item == null) continue;
Personnellement, je pense que si vous avez un objet nul à ce stade, quelque chose s'est mal passé beaucoup plus tôt et c'est là que la validation devrait être, ou ai-je tort?Utilisez Reflection pour ce faire
la source
J'ai cherché la réponse à une question similaire sur cette page, j'ai écrit les réponses à plusieurs questions similaires qui peuvent aider les personnes qui entrent sur cette page.
Liste des classes
La classe List <T> représente la liste des objets accessibles par index. Il appartient à l'espace de noms System.Collection.Generic. La classe List peut être utilisée pour créer une collection de différents types comme des entiers, des chaînes, etc. La classe List fournit également les méthodes pour rechercher, trier et manipuler des listes.
Classe avec propriété :
OR, Classe avec champ :
OU, Liste des objets (sans les mêmes cellules):
OU, Liste des objets (il doit avoir les mêmes cellules):
OU, Liste des objets (avec clé):
OU, Liste des dictionnaires
Bonne chance..
la source
Un petit mot d'avertissement, si "faire des choses" signifie mettre à jour la valeur de la propriété réelle que vous visitez ET s'il existe une propriété de type struct le long du chemin de l'objet racine à la propriété visitée, la modification que vous avez apportée à la propriété sera ne pas être reflété sur l'objet racine.
la source
Je n'ai pu obtenir aucune des méthodes ci-dessus, mais cela a fonctionné. Le nom d'utilisateur et le mot de passe pour DirectoryEntry sont facultatifs.
la source
Une solution de copier-coller (méthodes d'extension) principalement basée sur les réponses précédentes à cette question.
Gère également correctement IDicitonary (ExpandoObject / dynamic) qui est souvent nécessaire pour traiter ces éléments reflétés.
Non recommandé pour une utilisation dans les boucles serrées et autres chemins chauds. Dans ces cas, vous aurez besoin d'une compilation d'arborescence de mise en cache / émission IL / expression.
la source