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?


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


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


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.