BindingFlags.IgnoreCase non funziona per Type.GetProperty ()?


183

Immagina quanto segue

Un tipo T ha un campo Azienda. Quando si esegue il seguente metodo funziona perfettamente:

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

Con la seguente chiamata mi viene comunque annullato

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

Qualcuno ha un'idea?


20
@OregonGhost: importa?
leppie,

9
Mentre la tua meta domanda è valida, non importa davvero. Come la maggior parte delle mie domande, la mia ragione principale è la fame di conoscenza;)
Boris Callens,

1
@leppie: Sì, lo fa. Forse esiste un caso d'uso per questo di cui non sono a conoscenza, ed è sempre interessante il motivo per cui le persone vogliono fare le cose.
OregonGhost,

21
@OregonGhost: non tutte le lingue che hanno come target .Net fanno distinzione tra maiuscole e minuscole, ecco perché a volte devi fare una ricerca senza distinzione tra maiuscole e minuscole.
Pop Catalin,

2
Caso d'uso per me: così posso confrontare gli oggetti con un'entità compatta MSSQL senza preoccuparmi di come hanno digitato i campi. (Sto confrontando un oggetto con un database compatto in cui alcuni campi sono denominati isSomething e IsSomething.) In altre parole, per motivi di pigrizia.
Teynon,

Risposte:


389

Hai sovrascritto i flag di ricerca predefiniti, se specifichi nuovi flag devi fornire tutte le informazioni per poter trovare la proprietà. Per esempio:BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance


7
qualcuno ha idea del perché sia ​​così (chiedere amor di conoscenza;))
Shrivallabh,

2
@Shrivallabh BindingFlags.Public | BindingFlags.Instance sono flag predefiniti quando si fornisce solo il nome della proprietà
Otabek Kholikov

1
@Shrivallabh Aggiungendo alla spiegazione di OtabekKholikov, se si trattenesse queste impostazioni predefinite e si aggiungesse (O) le proprie specificate BindingFlags, non ci sarebbe modo di non utilizzare le impostazioni predefinite. Vale a dire non sarebbe possibile escludere Publicproprietà o escludere Instanceproprietà. Hanno deciso di prendere le impostazioni predefinite o di sostituirle specificando esattamente cosa stai cercando.
xr280xr,

36

Devi aggiungere BindingFlags.Public | BindingFlags.Instance


2
Ottieni meno voti, ma eri 2 minuti più veloce - ma poi di nuovo, la risposta di Pop aveva più dettagli. Do voti a tutti coloro che meritano! :)
Tony Basallo,

10

Grazie, questo mi ha davvero aiutato in un pizzico oggi. Avevo salvato le informazioni di controllo, ma con un involucro errato sui nomi delle proprietà. (Il controllo è integrato in un datalayer.) Comunque ho dovuto aggiungere IgnoreCase come flag di associazione, ma poi non ha funzionato fino a quando il mio collega non ha trovato questa risposta. La funzione risultante:

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

Questo fa parte di una classe che chiamo DotMagic.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.