Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
lubBindingFlags.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
iprotected
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.IgnoreCase
aby 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
lubBindingFlags.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
iprotected
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.IgnoreCase
aby 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.