BindingFlags.IgnoreCase não está funcionando para Type.GetProperty ()?

183

Imagine o seguinte

Um tipo T tem um campo Empresa. Ao executar o seguinte método, ele funciona perfeitamente:

Type t = typeof(T);
t.GetProperty("Company")

Com a chamada a seguir, fico nulo

Type t = typeof(T);
t.GetProperty("company", BindingFlags.IgnoreCase)

Alguém tem uma ideia?

Boris Callens
fonte
20
@ OregonGhost: Isso importa?
Leppie
9
Embora sua meta questão seja válida, isso realmente não importa. Como a maioria das minhas perguntas, minha razão principal é a fome de conhecimento;)
Boris Callens
1
@leppie: Sim, faz. Talvez exista um caso de uso para o qual eu não saiba, e sempre é interessante o motivo pelo qual as pessoas querem fazer as coisas.
OregonGhost 5/11
21
@OregonGhost: nem todos os idiomas que segmentam .Net diferenciam maiúsculas de minúsculas, é por isso que você precisa fazer uma pesquisa sem distinção entre maiúsculas e minúsculas.
Pop Catalin
2
Caso de uso para mim: para que eu possa comparar objetos com uma Entidade Compacta MSSQL sem me preocupar com como eles digitaram os campos. (Estou comparando um objeto com um banco de dados compacto, em que alguns campos são name isSomething e IsSomething.) Em outras palavras, por uma questão de preguiça.
teynon

Respostas:

389

Você substituiu os sinalizadores de pesquisa padrão. Se você especificar novos sinalizadores, precisará fornecer todas as informações para que a propriedade possa ser encontrada. Por exemplo:BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance

Pop Catalin
fonte
7
qualquer um tem alguma idéia de por que é assim (perguntando por causa do conhecimento;))
Shrivallabh
2
@Shrivallabh BindingFlags.Public | BindingFlags.Instance são bandeiras padrão quando você fornecer apenas o nome da propriedade
Otabek Kholikov
1
@Shrivallabh Adicionando à explicação de OtabekKholikov, se mantivéssemos esses padrões e adicionássemos (OR) o especificado BindingFlagsa eles, não haveria maneira de não usar os padrões. PublicOu seja, não seria possível excluir propriedades ou excluir Instancepropriedades. Eles decidiram que você aceita os padrões ou os substitui especificando exatamente o que procura.
xr280xr
36

Você precisa adicionar BindingFlags.Public | BindingFlags.Instance

leppie
fonte
2
Você recebe menos votos, mas foi 2 minutos mais rápido - mas, novamente, a resposta de Pop tinha mais detalhes. Dou votos a todos que merecem! :)
Tony Basallo
10

Obrigado, isso realmente me ajudou muito hoje. Eu tinha as informações de auditoria salvas, mas com letras incorretas nos nomes das propriedades. (A auditoria está incorporada em uma camada de dados.) De qualquer forma, tive que adicionar o IgnoreCase como um sinalizador de ligação, mas ainda assim não funcionou, até que meu colega de trabalho encontrasse essa resposta. A função resultante:

public static void SetProperty(Object R, string propertyName, object value)
{
    Type type = R.GetType();
    object result;
    result = type.InvokeMember(
        propertyName, 
        BindingFlags.SetProperty | 
        BindingFlags.IgnoreCase | 
        BindingFlags.Public | 
        BindingFlags.Instance, 
        null, 
        R, 
        new object[] { value });
}

Isso faz parte de uma classe que eu chamo de DotMagic.

Josh Warner-Burke
fonte