Usando PropertyInfo para averiguar el tipo de propiedad

108

Quiero analizar dinámicamente un árbol de objetos para realizar una validación personalizada. La validación no es importante como tal, pero quiero comprender mejor la clase PropertyInfo.

Haré algo como esto

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

Realmente, la única parte que me importa en este momento es 'si la propiedad es una cadena'. ¿Cómo puedo averiguar de un objeto PropertyInfo qué tipo es?

Tendré que lidiar con cosas básicas como cuerdas, ints, dobles. Pero también tendré que lidiar con los objetos y, de ser así, tendré que recorrer el árbol de objetos más abajo dentro de esos objetos para validar los datos básicos dentro de ellos, también tendrán cadenas, etc.

Gracias.

pedro
fuente

Respuestas:

215

Utilice PropertyInfo.PropertyTypepara obtener el tipo de propiedad.

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
fuente
1
Excelente. Intentaré esto. ¿Son equivalentes typeof (string) y typeof (String)? ¿Lo anterior con una cadena y una cadena?
Peter
3
OK, escribí algunas pruebas unitarias y funciona de maravilla. De hecho, trata la cadena y la cadena de la misma manera. Esperaba eso, pero solo quería asegurarme.
Peter
4
@peter Sí, stringy Stringsomos iguales. stringes un alias de String.
Edad
El método IsAssignableFrom: msdn.microsoft.com/en-us/library/… funcionará en más casos (en lugar del operador igual, por ejemplo, genéricos)
martin
1
@bump Acabo de ver este comentario de hace unos años, pero solo quiero agregar para mayor claridad que stringes un alias System.String. Podría marcar la diferencia porque para usarlo Stringdebes agregar la using System;línea. Mis 2 centavos;)
Sébastien Sevrin
0

Me acabo de encontrar con esta gran publicación. Si solo está verificando si los datos son de tipo cadena, tal vez podamos omitir el ciclo y usar esta estructura (en mi humilde opinión)

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