Utilizzo di PropertyInfo per scoprire il tipo di proprietà


108

Voglio analizzare dinamicamente un albero di oggetti per eseguire una convalida personalizzata. La convalida non è importante in quanto tale, ma voglio capire meglio la classe PropertyInfo.

Farò qualcosa di simile

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;
}

In realtà l'unica parte che mi interessa al momento è "se la proprietà è una stringa". Come posso scoprire da un oggetto PropertyInfo di che tipo è.

Dovrò occuparmi di cose di base come stringhe, int, doppi. Ma dovrò anche occuparmi degli oggetti, e in tal caso dovrò attraversare l'albero degli oggetti più in basso all'interno di quegli oggetti per convalidare i dati di base al loro interno, avranno anche stringhe ecc.

Grazie.

Risposte:


215

Utilizzare PropertyInfo.PropertyTypeper ottenere il tipo di proprietà.

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;
}

1
Grande. Lo proverò. Typeof (string) e typeof (String) sono equivalenti? Quanto sopra sarà con sia una stringa che una stringa?
peter

3
OK, ho scritto alcuni test unitari e funziona a meraviglia. In effetti tratta string e String allo stesso modo. Me l'aspettavo, ma volevo solo assicurarmene.
peter

4
@peter Sì, stringe Stringsono uguali. stringè un alias per String.
Aage

Il metodo IsAssignableFrom: msdn.microsoft.com/en-us/library/... funzionerà in più casi (invece dell'operatore pari, ad esempio generici)
Martin

1
@bump Ho appena visto questo commento di alcuni anni fa, ma voglio solo aggiungere per chiarezza che stringè un alias per System.String. Potrebbe fare la differenza perché per usare Stringdevi aggiungere la using System;riga. I miei 2 centesimi;)
Sébastien Sevrin

0

Mi sono appena imbattuto in questo fantastico post. Se stai solo controllando se i dati sono di tipo stringa, forse possiamo saltare il ciclo e usare questa struttura (a mio modesto parere)

public static bool IsStringType(object data)
    {
        return (data.GetType().GetProperties().Where(x => x.PropertyType == typeof(string)).FirstOrDefault() != null);
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.