BindingFlags.IgnoreCase no funciona para Type.GetProperty ()?

183

Imagina lo siguiente

Un tipo T tiene un campo Empresa. Al ejecutar el siguiente método funciona perfectamente:

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

Con la siguiente llamada me vuelvo nulo

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

Alguien tiene una idea?

Boris Callens
fuente
20
@OregonGhost: ¿Importa?
Leppie
9
Si bien su meta pregunta es válida, en realidad no importa. Como la mayoría de mis preguntas, mi razón principal es el hambre de conocimiento;)
Boris Callens
1
@leppie: Sí, lo hace. Tal vez hay un caso de uso para esto que no conozco, y siempre es interesante por qué la gente quiere hacer cosas.
OregonGhost
21
@OregonGhost: no todos los idiomas que apuntan a .Net distinguen entre mayúsculas y minúsculas, es por eso que a veces es necesario hacer una búsqueda insensible a mayúsculas y minúsculas.
Pop Catalin
2
Caso de uso para mí: para poder comparar objetos con una entidad compacta MSSQL sin preocuparme de cómo escribieron los campos. (Estoy comparando un objeto con una base de datos compacta donde algunos campos son name isSomething e IsSomething). En otras palabras, por pereza.
teynon

Respuestas:

389

Ha sobrescrito los indicadores de búsqueda predeterminados; si especifica nuevos indicadores, debe proporcionar toda la información para poder encontrar la propiedad. Por ejemplo:BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance

Pop Catalin
fuente
77
Alguien
2
@Shrivallabh BindingFlags.Public | BindingFlags.Instance son banderas predeterminadas cuando se suministra solo el nombre de la propiedad
Otabek Kholikov
1
@Shrivallabh Agregando a la explicación de OtabekKholikov, si se tratara de mantener estos valores predeterminados y agregar (O) lo especificado BindingFlagsa ellos, no habría forma de no usar los valores predeterminados. Es decir, no sería posible excluir Publicpropiedades o excluir Instancepropiedades. Decidieron que tomas los valores predeterminados o los anulas especificando exactamente lo que buscas.
xr280xr
36

Necesitas agregar BindingFlags.Public | BindingFlags.Instance

leppie
fuente
2
Obtienes menos votos, pero fuiste 2 minutos más rápido, pero una vez más, la respuesta de Pop tenía más detalles. ¡Doy votos a todos los que lo merecen! :)
Tony Basallo
10

Gracias, esto realmente me ayudó en una pizca hoy. Tenía información de auditoría guardada, pero con una carcasa incorrecta en los nombres de las propiedades. (La auditoría está integrada en una capa de datos). De todos modos, tuve que agregar IgnoreCase como un indicador vinculante, pero luego no funcionó, hasta que mi compañero de trabajo encontró esta respuesta. La función 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 });
}

Esto es parte de una clase que llamo DotMagic.

Josh Warner-Burke
fuente