10 votes

Boucle à travers l'objet et obtenir les propriétés

J'ai une méthode qui retourne une liste de propriétés du système d'exploitation. J'aimerais boucler à travers les propriétés et faire du traitement sur chacune. Toutes les propriétés sont des chaînes de caractères

Comment puis-je boucler à travers l'objet

C#

// test1 et test2 pour que vous puissiez voir un exemple simple des propriétés - bien que celles-ci ne fassent pas partie de la question
String test1 = OS_Result.OSResultStruct.OSBuild;
String test2 = OS_Result.OSResultStruct.OSMajor;

// voici ce que j'aimerais pouvoir faire
foreach (string s in OS_Result.OSResultStruct)
{
    // obtenir la chaîne de caractères et faire du travail....
    string test = s;
    //......

}

14voto

dasblinkenlight Points 264350

Vous pouvez le faire avec reflection :

// Obtenir une liste de propriétés de type chaîne de caractères
var stringProps = OS_Result
    .OSResultStruct
    .GetType()
    .GetProperties()
    .Where(p => p.PropertyType == typeof(string));
foreach (var prop in stringProps) {
    // Utiliser l'objet PropertyInfo pour extraire la valeur correspondante
    // de l'objet OS_Result.OSResultStruct
    string val = (string)prop.GetValue(OS_Result.OSResultStruct);
    ...
}

[EDIT by [Matthew Watson]](https://stackoverflow.com/users/106159/matthew-watson) J'ai pris la liberté d'ajouter un autre exemple de code, basé sur le code ci-dessus.

Vous pourriez généraliser la solution en écrivant une méthode qui renverra un IEnumerable pour n'importe quel type d'objet :

public static IEnumerable> StringProperties(object obj)
{
    return from p in obj.GetType().GetProperties()
            where p.PropertyType == typeof(string)
            select new KeyValuePair(p.Name, (string)p.GetValue(obj));
}

Et vous pouvez généraliser encore plus avec des génériques :

public static IEnumerable> PropertiesOfType(object obj)
{
    return from p in obj.GetType().GetProperties()
            where p.PropertyType == typeof(T)
            select new KeyValuePair(p.Name, (T)p.GetValue(obj));
}

En utilisant cette deuxième forme, pour parcourir toutes les propriétés de chaîne de caractères d'un objet, vous pourriez faire :

foreach (var property in PropertiesOfType(myObject)) {
    var name = property.Key;
    var val = property.Value;
    ...
}

2voto

Muhammad Omar Points 1204

Vous pouvez utiliser la réflexion pour parcourir le GetProperties Résultat:

OS_Result.OSResultStruct.GetType().GetProperties()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X