BindingFlags.IgnoreCase funktioniert nicht für Type.GetProperty ()?

183

Stellen Sie sich Folgendes vor

Ein Typ T hat ein Feld Firma. Bei der Ausführung der folgenden Methode funktioniert es einwandfrei:

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

Mit dem folgenden Aufruf bekomme ich allerdings null

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

Hat jemand eine Idee?

Boris Callens
quelle
20
@OregonGhost: Ist das wichtig?
Leppie
9
Während Ihre Meta-Frage gültig ist, spielt es in der Tat keine Rolle. Wie die meisten meiner Fragen ist mein Hauptgrund der Hunger nach Wissen;)
Boris Callens
1
@ leppie: Ja, das tut es. Vielleicht gibt es einen Anwendungsfall dafür, den ich nicht kenne, und es ist immer interessant, warum Leute Dinge tun wollen.
OregonGhost
21
@OregonGhost: Nicht alle Sprachen, die auf .Net abzielen, unterscheiden zwischen Groß- und Kleinschreibung. Deshalb müssen Sie manchmal nach Groß- und Kleinschreibung suchen.
Pop Catalin
2
Anwendungsfall für mich: So kann ich Objekte mit einer MSSQL Compact Entity vergleichen, ohne mir Gedanken darüber machen zu müssen, wie sie die Felder eingegeben haben. (Ich vergleiche ein Objekt mit einer kompakten Datenbank, in der einige Felder den Namen isSomething und IsSomething haben.) Mit anderen Worten, aus Gründen der Faulheit.
Teynon

Antworten:

389

Sie haben die Standard-Lookup-Flags überschrieben. Wenn Sie neue Flags angeben, müssen Sie alle Informationen angeben, damit die Eigenschaft gefunden werden kann. Beispielsweise:BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance

Pop Catalin
quelle
7
Jeder hat eine Ahnung, warum es so ist (um Wissen bitten;))
Shrivallabh
2
@Shrivallabh BindingFlags.Public | BindingFlags.Instance sind Standardflags, wenn Sie nur den Eigenschaftsnamen
angeben
1
@Shrivallabh Wenn man zu OtabekKholikovs Erklärung hinzufügt, wenn diese Standardeinstellungen beibehalten und Ihre angegebenen hinzugefügt (ODER) werden BindingFlags, gibt es keine Möglichkeit, die Standardeinstellungen nicht zu verwenden. Dh es wäre nicht möglich, PublicEigenschaften auszuschließen oder InstanceEigenschaften auszuschließen . Sie haben entschieden, dass Sie entweder die Standardeinstellungen übernehmen oder sie überschreiben, indem Sie genau angeben, wonach Sie suchen.
xr280xr
36

Sie müssen hinzufügen BindingFlags.Public | BindingFlags.Instance

Leppie
quelle
2
Du bekommst weniger Stimmen, aber du warst 2 Minuten schneller - aber andererseits hatte Pops Antwort mehr Details. Ich gebe allen Stimmen, die es verdienen! :)
Tony Basallo
10

Danke, das hat mir heute zur Not wirklich geholfen. Ich hatte Audit-Informationen gespeichert, aber mit falschem Gehäuse auf den Eigenschaftsnamen. (Die Prüfung ist in eine Datenschicht integriert.) Wie auch immer, ich musste IgnoreCase als Bindungsflag hinzufügen, aber dann funktionierte es immer noch nicht, bis mein Kollege diese Antwort fand. Die resultierende Funktion:

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

Dies ist Teil einer Klasse, die ich DotMagic nenne.

Josh Warner-Burke
quelle