BindingFlags.IgnoreCase nie działa dla Type.GetProperty ()?

183

Wyobraź sobie następujące

Typ T ma pole Firma. Podczas wykonywania następującej metody działa idealnie:

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

Jednak z następującą rozmową otrzymuję zero

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

Czy ktoś ma pomysł?

Boris Callens
źródło
20
@OregonGhost: Czy to ważne?
leppie
9
Chociaż twoje meta-pytanie jest prawidłowe, tak naprawdę to nie ma znaczenia. Jak większość moich pytań, moim głównym powodem jest głód wiedzy;)
Boris Callens,
1
@leppie: Tak, to prawda. Być może istnieje przypadek użycia tego, czego nie jestem świadomy, i zawsze jest interesujące, dlaczego ludzie chcą robić rzeczy.
OregonGhost,
21
@OregonGhost: nie we wszystkich językach docelowych .Net rozróżniana jest wielkość liter, dlatego czasami trzeba to zrobić i rozróżnić małe i wielkie litery.
Pop Catalin,
2
Przypadek użycia dla mnie: więc mogę porównywać obiekty z jednostką MSSQL Compact bez martwienia się o to, jak wpisali pola. (Porównuję obiekt do zwartej bazy danych, gdzie niektóre pola mają nazwy IsSomething i IsSomething.) Innymi słowy, ze względu na lenistwo.
teynon,

Odpowiedzi:

389

Zastąpiłeś domyślne flagi wyszukiwania, jeśli określisz nowe flagi, musisz podać wszystkie informacje, aby można było znaleźć właściwość. Na przykład:BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance

Pop Catalin
źródło
7
każdy ma pojęcie, dlaczego tak jest (prosząc o wiedzę;))
Shrivallabh
2
@Shrivallabh BindingFlags.Public | BindingFlags.Instance są domyślnymi flagami, gdy podajesz tylko nazwę właściwości
Otabek Kholikov
1
@Shrivallabh Dodając do objaśnienia OtabekKholikov, gdyby zachował te wartości domyślne i dodał (LUB) swoje określone BindingFlagsdo nich, nie byłoby sposobu, aby nie używać wartości domyślnych. Tj. Nie byłoby możliwe wykluczenie Publicwłaściwości lub wykluczenie Instancewłaściwości. Zdecydowali, że albo weźmiesz wartości domyślne, albo je zastąpisz, określając dokładnie to, czego szukasz.
xr280xr
36

Musisz dodać BindingFlags.Public | BindingFlags.Instance

leppie
źródło
2
Otrzymujesz mniej głosów, ale byłeś 2 minuty szybciej - ale znowu odpowiedź Popa zawierała więcej szczegółów. Daję głos wszystkim, którzy na to zasługują! :)
Tony Basallo,
10

Dzięki, to naprawdę pomogło mi dzisiaj w szczypcie. Zapisałem informacje z audytu, ale z niepoprawną obudową nazw nieruchomości. (Kontrola jest wbudowana w warstwę danych). W każdym razie musiałem dodać IgnoreCase jako wiążącą flagę, ale potem nadal nie działało, dopóki mój współpracownik nie znalazł tej odpowiedzi. Wynikowa funkcja:

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

Jest to część klasy, którą nazywam DotMagic.

Josh Warner-Burke
źródło