130 votes

Utilisation de PropertyInfo pour connaître le type de propriété

Je veux analyser dynamiquement un arbre d'objets pour effectuer une validation personnalisée. La validation n'est pas importante en soi, mais je veux mieux comprendre la classe PropertyInfo.

Je vais faire quelque chose comme ça :

public bool ValidateData(object data)
{
    foreach (PropertyInfo propertyInfo in data.GetType().GetProperties())
    {
        if (the property is a string)
        {
            string value = propertyInfo.GetValue(data, null);

            if value is not OK
            {
                return false;
            }
        }
    }            

    return true;
}

La seule partie qui m'intéresse pour le moment est "si la propriété est une chaîne". Comment puis-je savoir, à partir d'un objet PropertyInfo, de quel type il s'agit ?

Je vais devoir m'occuper des trucs de base comme les chaînes, les ints, les doubles. Mais je devrai aussi m'occuper d'objets, et si c'est le cas, je devrai parcourir l'arbre des objets plus bas dans ces objets pour valider les données de base qu'ils contiennent, ils auront aussi des chaînes de caractères, etc.

259voto

Igor Zevaka Points 32586

Utilisez PropertyInfo.PropertyType pour obtenir le type de la propriété.

public bool ValidateData(object data)
{
    foreach (PropertyInfo propertyInfo in data.GetType().GetProperties())
    {
        if (propertyInfo.PropertyType == typeof(string))
        {
            string value = propertyInfo.GetValue(data, null);

            if value is not OK
            {
                return false;
            }
        }
    }            

    return true;
}

0 votes

La méthode IsAssignableFrom : msdn.microsoft.com/fr/us/library/ fonctionnera dans un plus grand nombre de cas (au lieu de l'opérateur equal, par exemple dans les génériques).

2 votes

Comment trouver le type d'une propriété qui n'est ni un String ni un int mais une classe personnalisée ? par exemple, public classA objA ;

3voto

A. Varma Points 337

Je viens de tomber par hasard sur cet excellent article. Si vous vérifiez simplement si les données sont de type chaîne de caractères, vous pouvez peut-être sauter la boucle et utiliser cette structure (à mon humble avis).

public static bool IsStringType(object data)
    {
        return (data.GetType().GetProperties().Where(x => x.PropertyType == typeof(string)).FirstOrDefault() != null);
    }

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