2009-10-09 14 views
52

Jeśli użyjęKorzystanie GetProperties() z BindingFlags.DeclaredOnly w .NET Odbicie

sometype.GetProperties(); 

uzyskać wszystkie właściwości z typem i jest rodzicem. Jednak chcę tylko pobrać właściwości zdefiniowane jawnie w tym typie (nie rodzice). Myślałem, że to właśnie była opcja dla BindingFlags.DeclaredOnly.

Jednak, gdy próbuję to:

sometype.GetProperties(BindingFlags.DeclaredOnly); 

otrzymuję 0 właściwości.

Ktoś wie, co robię źle?

+11

'Dla wszystkich, którzy pochodzą z google:' jeśli nadal nie może uzyskać „Właściwości”, nawet po ustawieniu flagi, jeśli jesteś ponownie do C# i nie wiem różnicy między 'Properties' i' Fields', spróbuj użyć 'GetFields()'. Prawdopodobnie cały czas szukasz "pól"! – user1306322

+0

@ user1306322: tylko dla rekordu, "pochodzę z google", a mój kod to: 'var typy = type.GetFields.Select (f => f.FieldType) .Union (type.GetProperties.Select (p => p .PropertyType)); '- a wyniki nadal się liczą 0. – Veverke

Odpowiedz

73

Jeśli podasz żadnej BindingFlags, to trzeba wyraźnie określić właściwości co chcesz uzyskać. Na przykład:

sometype.GetProperties (BindingFlags.DeclaredOnly | 
         BindingFlags.Public | 
         BindingFlags.Instance); 
43

Podsumowując:

  1. jeśli używasz GetProperties() przeciążenie (bez parametrów), dostaniesz wszystkie publicznych właściwości.

  2. Z drugiej strony, jeśli używasz GetProperties(BindingFlags) przeciążenie (tej, która przyjmuje parametr BindingFlags), następnie trzeba określić bitowego lub co najmniej po jednym z każdej grupy następujących flag:

    • BindingFlags.Instance/BindingFlags.Static (przykład vs właściwości statycznych)
    • BindingFlags.Public/BindingFlags.NonPublic (publiczne vs właściwości nie publicznych).

Na przykład, aby uzyskać publicznych właściwości statyczne, trzeba będzie zadzwonić GetProperties(BindingFlags.Public | BindingFlags.Static) w celu uzyskania wyników. Wywołanie tylko GetProperties(BindingFlags.Public) lub GetProperties(BindingFlags.Static) nie zwróci żadnych wyników.

Należy również zauważyć, że określenie BindingFlags.Default zwróci pustą tablicę .

Szczegółowe informacje można znaleźć w MSDN documentation for GetProperties(BindingFlags):

  • należy określić zarówno : filtry flagi mogą być używane do określenia, które zagnieżdżone typy umieścić w poszukiwaniu

    Poniższe BindingFlags BindingFlags.Instance lub BindingFlags.Static w celu uzyskania zwrotu.

  • Podaj BindingFlags.Public, aby uwzględnić właściwości publiczne w wyszukiwaniu.
  • Podaj BindingFlags.NonPublic, aby uwzględnić metody niepubliczne (tj. Prywatne, wewnętrzne i chronione) w wyszukiwaniu. Zwracane są tylko chronione i wewnętrzne metody na klasach bazowych; prywatne metody na klasach bazowych nie są zwracane.
  • Podaj BindingFlags.FlattenHierarchy aby włączyć do hierarchii publicznych i chronionych statycznych członków; prywatne statyczne elementy w odziedziczonych klasach nie są uwzględniane.

Poniższe BindingFlags modyfikujące flagi mogą być używane do zmiany, jak działa wyszukiwanie:

  • BindingFlags.DeclaredOnly szukać tylko właściwości zadeklarowane na rodzaj, właściwości, które nie były po prostu dziedziczone.
+0

Aby to wskazać: * bez * żadnych BindingFlags, istnieją pewne wartości domyślne. Czy wiesz, kim oni są? –

+1

Jeśli użyjesz przeciążenia 'GetProperties()' (bez parametrów), uzyskasz wszystkie właściwości publiczne. Ale 'GetProperties (BindingFlags.Default)' zwróci pustą tablicę. – Groo

+0

Heh, więc jaki jest pożytek z BindingFlags.Default ?! ;) – UpTheCreek

15

Musisz nieco rozszerzyć swoją BindingsFlag. Muszą co najmniej uwzględniać poziom dostępności i instancję względem statycznej, aby odzyskać coś znaczącego.

myślę czego rzeczywiście szukają jest następujący

var flags = BindingFlags.DeclaredOnly 
    | BindingFlags.Instance 
    | BindingFlags.Public; 
someType.GetProperties(flags); 
0

Ze strony MSDN.

Domyślny (członek) Określa brak flagi wiążącej.

Należy określić instancję lub statyczną wraz z publiczną lub niepubliczną lub brak członków zostanie zwrócona.

Dlatego jeśli nie określisz flag wiążących, nic nie otrzymasz.

-1

miałem problemy z wykorzystaniem typeof(Thing), ostatecznie ten pracował dla mnie:

 var thisThing = (new Thing()).GetType(); 
     foreach (var property in thisThing.GetProperties()) 
     { 
      // ... 
     } 
Powiązane problemy