Udostępnij za pośrednictwem


Metody System.Type.GetProperty

Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.

Następujące wskazówki dotyczą wszystkich przeciążeń:

  • Właściwość jest uważana za publiczną w refleksji, jeśli ma przynajmniej jeden publiczny akcesor. W przeciwnym razie właściwość jest uznawana za prywatną i należy użyć BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static (w języku Visual Basic połącz wartości przy użyciu Or), aby ją pobrać.
  • Jeśli bieżący Type reprezentuje skonstruowany typ ogólny, ta metoda zwraca PropertyInfo z zastąpionymi parametrami typu przez odpowiednie argumenty typu.
  • Jeśli bieżący Type reprezentuje parametr typu w definicji typu ogólnego lub metody ogólnej, ta metoda wyszukuje właściwości ograniczenia klasy.

Metoda GetProperty(String)

Wyszukiwanie name uwzględnia wielkość liter. Wyszukiwanie obejmuje właściwości publiczne statyczne i publiczne instancji.

Sytuacje, w których występuje AmbiguousMatchException, obejmują następujące:

  • Typ zawiera dwie właściwości indeksowane, które mają taką samą nazwę, ale różne liczby parametrów. Aby rozwiązać niejednoznaczność, użyj przeciążenia metody GetProperty, które określa typy parametrów.
  • Typ pochodny deklaruje właściwość, która ukrywa dziedziczona właściwość o tej samej nazwie przy użyciu new modyfikatora (Shadows w Visual Basic). Aby rozwiązać niejednoznaczność, użyj przeciążenia metody GetProperty(String, BindingFlags) i dodaj flagę BindingFlags.DeclaredOnly, aby ograniczyć wyszukiwanie do niedziedziczonych członków.

Metoda GetProperty(String, BindingFlags)

Następujące BindingFlags flagi filtru mogą służyć do definiowania właściwości do uwzględnienia w wyszukiwaniu:

  • Musisz określić wartość BindingFlags.Instance lub BindingFlags.Static w celu uzyskania zwrotu.
  • Określ BindingFlags.Public , aby uwzględnić właściwości publiczne w wyszukiwaniu.
  • Określ BindingFlags.NonPublic , aby uwzględnić właściwości inne niż publiczne (czyli właściwości prywatne, wewnętrzne i chronione) w wyszukiwaniu.
  • Określ BindingFlags.FlattenHierarchy, aby uwzględnić public i protected statyczne członków w hierarchii; private statyczne członkowie w klasach dziedziczonych nie są uwzględniane.

Następujące BindingFlags flagi modyfikatora mogą służyć do zmiany sposobu działania wyszukiwania:

  • BindingFlags.IgnoreCaseaby zignorować przypadek .name
  • BindingFlags.DeclaredOnly aby wyszukać tylko właściwości zadeklarowane w Typeobiekcie , a nie właściwości, które zostały po prostu odziedziczone.

Sytuacje, w których występuje AmbiguousMatchException, obejmują następujące:

  • Typ zawiera dwie właściwości indeksowane, które mają taką samą nazwę, ale różne liczby parametrów. Aby rozwiązać niejednoznaczność, użyj przeciążenia metody GetProperty, które określa typy parametrów.
  • Typ pochodny deklaruje właściwość, która ukrywa dziedziczona właściwość o tej samej nazwie przy użyciu new modyfikatora (Shadows w Visual Basic). Aby rozwiązać niejednoznaczność, należy uwzględnić BindingFlags.DeclaredOnly, aby ograniczyć wyszukiwanie do członków, które nie są dziedziczone.

GetProperty(System.String, System.Reflection.BindingFlags, System.Reflection.Binder, System.Type, System.Type[], Metoda System.Reflection.ParameterModifier[])

Mimo że domyślny binder nie przetwarza ParameterModifier (parametr modifiers), można użyć abstrakcyjnej klasy System.Reflection.Binder , aby napisać niestandardowy binder, który przetwarza modifiers. ParameterModifier jest używany tylko przy wywołaniach międzyoperacyjnych COM, a obsługiwane są tylko parametry przekazywane przez referencję.

W poniższej tabeli przedstawiono, które elementy członkowskie klasy bazowej są zwracane przez Get metody podczas odzwierciedlania typu.

Typ członka Statyczny Niestatyczny
Konstruktor Nie. Nie.
(No changes needed) Nie. Tak. Pole jest zawsze ukrywane za pomocą nazwy i podpisu.
Zdarzenie Nie dotyczy Zasadą wspólnego systemu typów jest to, że dziedziczenie jest takie samo jak w przypadku metod implementujących atrybut. Refleksja traktuje właściwości jako ukryte według nazwy i sygnatury.2
Metoda Nie. Tak. Metoda (zarówno wirtualna, jak i niewirtualna) może być ukrywana według nazwy lub według nazwy i podpisu.
Typ zagnieżdżony Nie. Nie.
Majątek Nie dotyczy Zasadą wspólnego systemu typów jest to, że dziedziczenie jest takie samo jak w przypadku metod implementujących atrybut. Refleksja traktuje właściwości jako ukryte według nazwy i sygnatury.2

Notatki:

  • Funkcja Hide-by-name-and-signature uwzględnia wszystkie części podpisu, w tym niestandardowe modyfikatory, typy zwracane, typy parametrów, sentinels i niezarządzane konwencje wywoływania. Jest to porównanie binarne.
  • W przypadku refleksji właściwości i zdarzenia są ukrywane przez nazwę i sygnaturę. Jeśli masz właściwość z akcesorami get i set w klasie bazowej, ale klasa pochodna ma tylko akcesor get, właściwość klasy pochodnej przesłania właściwość klasy bazowej i nie będzie można uzyskać dostępu do metody set w klasie bazowej.
  • Atrybuty niestandardowe nie są częścią wspólnego systemu typów.

Następujące BindingFlags flagi filtru mogą służyć do definiowania właściwości do uwzględnienia w wyszukiwaniu:

  • Musisz określić wartość BindingFlags.Instance lub BindingFlags.Static w celu uzyskania zwrotu.
  • Określ BindingFlags.Public , aby uwzględnić właściwości publiczne w wyszukiwaniu.
  • Określ BindingFlags.NonPublic , aby uwzględnić właściwości inne niż publiczne (czyli właściwości prywatne, wewnętrzne i chronione) w wyszukiwaniu.
  • Określ BindingFlags.FlattenHierarchy, aby uwzględnić public i protected statyczne członków w hierarchii; private statyczne członkowie w klasach dziedziczonych nie są uwzględniane.

Następujące BindingFlags flagi modyfikatora mogą służyć do zmiany sposobu działania wyszukiwania:

  • BindingFlags.IgnoreCaseaby zignorować przypadek .name
  • BindingFlags.DeclaredOnly aby wyszukać tylko właściwości zadeklarowane w Typeobiekcie , a nie właściwości, które zostały po prostu odziedziczone.

Indeksatory i właściwości domyślne

Język Visual Basic, C# i C++ mają uproszczoną składnię uzyskiwania dostępu do indeksowanych właściwości i umożliwiają domyślne używanie jednej indeksowanej właściwości dla jej typu. Jeśli na przykład zmienna myList odwołuje się do zmiennej ArrayList, składnia myList[3] (myList(3) w Visual Basic) pobiera element z indeksem 3. Właściwość można przeciążyć.

W języku C# ta funkcja nazywana jest indekserem i nie można się do niej odwoływać po nazwie. Domyślnie indeksator języka C# jest wyświetlany w metadanych jako właściwość indeksowana o nazwie Item. Jednak deweloper biblioteki klas może użyć atrybutu IndexerNameAttribute , aby zmienić nazwę indeksatora w metadanych. Na przykład String klasa ma indeksator o nazwie Chars[]. Indeksowane właściwości utworzone przy użyciu języków innych niż C# mogą mieć nazwy inne niż Item, jak również.

Aby określić, czy typ ma właściwość domyślną, użyj GetCustomAttributes(Type, Boolean) metody do przetestowania atrybutu DefaultMemberAttribute . Jeśli typ ma DefaultMemberAttributewartość , MemberName właściwość zwraca nazwę właściwości domyślnej.