Usando PropertyInfo para descobrir o tipo de propriedade

108

Eu quero analisar dinamicamente uma árvore de objeto para fazer alguma validação personalizada. A validação não é importante como tal, mas quero entender melhor a classe PropertyInfo.

Estarei fazendo algo assim,

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

Na verdade, a única parte que me interessa no momento é 'se a propriedade for uma string'. Como posso descobrir de um objeto PropertyInfo que tipo é.

Terei que lidar com coisas básicas como cordas, ints, duplos. Mas também terei de lidar com objetos e, se for o caso, precisarei percorrer a árvore de objetos mais para baixo dentro desses objetos para validar os dados básicos dentro deles, eles também terão strings etc.

Obrigado.

Peter
fonte

Respostas:

215

Use PropertyInfo.PropertyTypepara obter o tipo da propriedade.

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
fonte
1
Ótimo. Eu vou tentar isso. Typeof (string) e typeof (String) são equivalentes? Será que o item acima com uma string e String?
Pedro,
3
OK, escrevi alguns testes de unidade e funciona muito bem. Na verdade, trata string e String da mesma forma. Eu esperava isso, mas só queria ter certeza.
Pedro,
4
@peter Sim, stringe Stringsão iguais. stringé um alias para String.
Aage de
O método IsAssignableFrom: msdn.microsoft.com/en-us/library/… funcionará em mais casos (em vez do operador igual, por exemplo, genéricos)
martin
1
@bump Acabei de ver este comentário de alguns anos atrás, mas gostaria apenas de esclarecer que stringé um apelido para System.String. Pode fazer diferença porque para usar Stringé preciso adicionar a using System;linha. Meus 2 centavos;)
Sébastien Sevrin
0

Acabei de topar com este ótimo post. Se você está apenas verificando se os dados são do tipo string, talvez possamos pular o loop e usar esta estrutura (na minha humilde opinião)

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