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

108

Je souhaite analyser dynamiquement une arborescence d'objets pour effectuer une validation personnalisée. La validation n'est pas importante en tant que telle, mais je souhaite 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;
}

Vraiment, la seule partie qui me préoccupe 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 de trucs basiques comme des cordes, des entiers, des doubles. Mais je devrai également m'occuper des objets, et si c'est le cas, je devrai parcourir l'arborescence d'objets plus bas à l'intérieur de ces objets pour valider les données de base à l'intérieur, ils auront également des chaînes, etc.

Merci.

peter
la source

Réponses:

215

Utilisez PropertyInfo.PropertyTypepour 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;
}
Igor Zevaka
la source
1
Génial. J'essaierai ceci. Est-ce que typeof (chaîne) et typeof (chaîne) sont équivalents? Est-ce que ce qui précède avec à la fois une chaîne et une chaîne?
peter
3
OK, j'ai écrit des tests unitaires et ça marche un régal. Il traite en effet la chaîne et la chaîne de la même manière. Je m'y attendais, mais je voulais juste m'en assurer.
peter
4
@peter Oui, stringet Stringsont égaux. stringest un alias pour String.
Âge
La méthode IsAssignableFrom: msdn.microsoft.com/en-us/library/… fonctionnera dans plus de cas (au lieu de l'opérateur égal, par exemple les génériques)
martin
1
@bump Je viens de voir ce commentaire d'il y a quelques années, mais je veux juste ajouter pour plus de clarté qu'il strings'agit d'un alias System.String. Cela pourrait faire une différence car pour utiliser, Stringvous devez ajouter la using System;ligne. Mes 2 cents;)
Sébastien Sevrin
0

Je viens de tomber sur ce super article. Si vous vérifiez simplement si les données sont de type chaîne, nous pouvons peut-être ignorer 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);
    }
A. Varma
la source