BindingFlags.IgnoreCase ne fonctionne pas pour Type.GetProperty ()?

183

Imaginez ce qui suit

Un type T a un champ Société. Lors de l'exécution de la méthode suivante, cela fonctionne parfaitement:

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

Avec l'appel suivant, je deviens nul

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

Quelqu'un a une idée?

Boris Callens
la source
20
@OregonGhost: Est-ce important?
leppie
9
Bien que votre méta question soit valide, cela n'a pas vraiment d'importance. Comme la plupart de mes questions, ma principale raison est la soif de savoir;)
Boris Callens
1
@leppie: Oui, c'est vrai. Il y a peut-être un cas d'utilisation pour cela dont je ne suis pas conscient, et il est toujours intéressant de savoir pourquoi les gens veulent faire des choses.
OregonGhost
21
@OregonGhost: toutes les langues ciblant .Net ne sont pas sensibles à la casse, c'est pourquoi vous devez parfois effectuer une recherche insensible à la casse.
Pop Catalin
2
Cas d'utilisation pour moi: je peux donc comparer des objets à une entité compacte MSSQL sans me soucier de la façon dont ils ont tapé les champs. (Je compare un objet à une base de données compacte où certains champs sont name isSomething et IsSomething.) En d'autres termes, par paresse.
teynon

Réponses:

389

Vous avez écrasé les indicateurs de recherche par défaut, si vous spécifiez de nouveaux indicateurs, vous devez fournir toutes les informations pour que la propriété puisse être trouvée. Par exemple:BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance

Pop Catalin
la source
7
tout le monde a une idée de pourquoi c'est comme ça (demander pour la connaissance;))
Shrivallabh
2
@Shrivallabh BindingFlags.Public | BindingFlags.Instance sont des indicateurs par défaut lorsque vous fournissez uniquement le nom de la propriété
Otabek Kholikov
1
@Shrivallabh Ajoutant à l'explication d'OtabekKholikov, s'il devait conserver ces valeurs par défaut et y ajouter (OU) votre spécification BindingFlags, il n'y aurait aucun moyen de ne pas utiliser les valeurs par défaut. Ie Il ne serait pas possible d'exclure des Publicpropriétés ou d'exclure des Instancepropriétés. Ils ont décidé que vous preniez les valeurs par défaut ou que vous les remplaçiez en spécifiant exactement ce que vous recherchez.
xr280xr
36

Vous devez ajouter BindingFlags.Public | BindingFlags.Instance

leppie
la source
2
Vous obtenez moins de votes, mais vous avez été 2 minutes plus rapide - mais là encore, la réponse de Pop avait plus de détails. Je donne des votes à tous ceux qui le méritent! :)
Tony Basallo
10

Merci, cela m'a vraiment aidé à la rigueur aujourd'hui. J'avais des informations d'audit enregistrées, mais avec un boîtier incorrect sur les noms de propriété. (L'audit est intégré à un datalayer.) Quoi qu'il en soit, j'ai dû ajouter IgnoreCase comme indicateur de liaison, mais cela n'a toujours pas fonctionné, jusqu'à ce que mon collègue trouve cette réponse. La fonction résultante:

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

Cela fait partie d'une classe que j'appelle DotMagic.

Josh Warner-Burke
la source