Sdílet prostřednictvím


Metody System.Type.GetProperty

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

Následující pokyny platí pro všechna přetížení:

  • Vlastnost je považována za veřejnou pro reflexi, pokud má alespoň jeden přístup, který je veřejný. V opačném případě je vlastnost považována za soukromou a k jejímu získání je nutné použít BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static (v jazyce Visual Basic zkombinovat hodnoty pomocí).Or
  • Pokud aktuální Type představuje vytvořený obecný typ, tato metoda vrátí PropertyInfo s parametry typu nahrazené odpovídajícími argumenty typu.
  • Pokud aktuální Type představuje parametr typu v definici obecného typu nebo obecné metody, tato metoda hledá vlastnosti omezení třídy.

metoda GetProperty(String)

Hledání pro name rozlišuje malá a velká písmena. Hledání obsahuje veřejné statické a veřejné vlastnosti instance.

Situace, ve kterých nastává AmbiguousMatchException, zahrnují:

  • Typ obsahuje dvě indexované vlastnosti, které mají stejný název, ale různá čísla parametrů. K vyřešení nejednoznačnosti použijte přetížení metody GetProperty, které určuje typy parametrů.
  • Odvozený typ deklaruje vlastnost, která skryje zděděnou vlastnost se stejným názvem pomocí modifikátoru new (Shadows v jazyce Visual Basic). K vyřešení nejednoznačnosti použijte přetížení metody GetProperty(String, BindingFlags) a přidejte příznak BindingFlags.DeclaredOnly k omezení vyhledávání na členy, které nejsou děděné.

metoda GetProperty(String, BindingFlags)

BindingFlags Následující příznaky filtru lze použít k definování vlastností, které se mají zahrnout do hledání:

  • Abyste získali vrácení, je nutné zadat buď BindingFlags.Instance nebo BindingFlags.Static.
  • Zadejte BindingFlags.Public , aby se do hledání zahrnuly veřejné vlastnosti.
  • Zadejte BindingFlags.NonPublic , aby se do hledání zahrnuly neveřejné vlastnosti (tj. soukromé, interní a chráněné vlastnosti).
  • Určete BindingFlags.FlattenHierarchy, aby se zahrnuly public a protected statické členy v hierarchii; ale private statické členy v zděděných třídách nejsou zahrnuty.

Ke změně fungování vyhledávání můžete použít následující BindingFlags modifikační příznaky:

  • BindingFlags.IgnoreCase ignorovat případ name.
  • BindingFlags.DeclaredOnly hledat pouze vlastnosti deklarované v objektu Type, nikoli vlastnosti, které byly jednoduše zděděny.

Situace, ve kterých nastává AmbiguousMatchException, zahrnují:

  • Typ obsahuje dvě indexované vlastnosti, které mají stejný název, ale různá čísla parametrů. K vyřešení nejednoznačnosti použijte přetížení metody GetProperty, které určuje typy parametrů.
  • Odvozený typ deklaruje vlastnost, která skryje zděděnou vlastnost se stejným názvem pomocí new modifikátoru (Shadows v jazyce Visual Basic). Chcete-li vyřešit nejednoznačnost, zahrňte BindingFlags.DeclaredOnly omezení vyhledávání na členy, které nejsou zděděné.

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

I když výchozí pořadač nezpracovává ParameterModifier ( modifiers parametr), můžete použít abstraktní System.Reflection.Binder třídu k zápisu vlastního pořadače, který zpracovává modifiers. ParameterModifier se používá pouze při volání přes COM interop a jsou zpracovávány pouze parametry předané odkazem.

Následující tabulka ukazuje, jaké členy základní třídy jsou vráceny metodami Get při reflexi typu.

Typ členu Statický. Nestatické
Konstruktor Ne Ne
Obor Ne Ano. Pole se vždy skryje podle názvu a signatury.
Událost Není relevantní Běžné pravidlo systému typů je, že dědičnost je stejná jako u metod, které implementují vlastnost. Reflexe zachází s vlastnostmi jako se skrýváním podle názvu a podpisu. 2
Metoda Ne Ano. Metodu (virtuální i ne virtuální) lze skrýt podle názvu nebo skrýt podle názvu a podpisu.
Vnořený typ Ne Ne
Vlastnictví Není relevantní Běžné pravidlo systému typů je, že dědičnost je stejná jako u metod, které implementují vlastnost. Reflexe zachází s vlastnostmi jako se skrýváním podle názvu a podpisu. 2

Poznámky:

  • Funkce skrytí podle jména a podpisu zohledňuje všechny části podpisu, včetně vlastních modifikátorů, návratových typů, typů parametrů, sentinelů a nespravovaných konvencí volání. Jedná se o binární porovnání.
  • Pro reflexi jsou vlastnosti a události skryty podle názvu a podpisu. Pokud máte vlastnost s oběma přístupovými metodami get i set v základní třídě, ale odvozená třída má pouze přístupovou metodu get, odvozená třída překryje vlastnost základní třídy a nebudete mít přístup k nastavovací metodě základní třídy.
  • Vlastní atributy nejsou součástí systému běžných typů.

BindingFlags Následující příznaky filtru lze použít k definování vlastností, které se mají zahrnout do hledání:

  • Abyste získali vrácení, je nutné zadat buď BindingFlags.Instance nebo BindingFlags.Static.
  • Zadejte BindingFlags.Public , aby se do hledání zahrnuly veřejné vlastnosti.
  • Zadejte BindingFlags.NonPublic , aby se do hledání zahrnuly neveřejné vlastnosti (tj. soukromé, interní a chráněné vlastnosti).
  • Určete BindingFlags.FlattenHierarchy, aby se zahrnuly public a protected statické členy v hierarchii; ale private statické členy v zděděných třídách nejsou zahrnuty.

Ke změně fungování vyhledávání můžete použít následující BindingFlags modifikační příznaky:

  • BindingFlags.IgnoreCase ignorovat případ name.
  • BindingFlags.DeclaredOnly hledat pouze vlastnosti deklarované v objektu Type, nikoli vlastnosti, které byly jednoduše zděděny.

Indexery a výchozí vlastnosti

Jazyk Visual Basic, C# a C++ mají zjednodušenou syntaxi pro přístup k indexovaným vlastnostem a umožňují, aby jedna indexovaná vlastnost byla výchozím nastavením pro jeho typ. Pokud například proměnná myList odkazuje na ArrayList, syntaxe myList[3] (myList(3) v jazyce Visual Basic) získá prvek s indexem 3. Vlastnost můžete přetížit.

V jazyce C# se tato funkce nazývá indexer a nemůže být odkazována podle názvu. Ve výchozím nastavení se indexer jazyka C# zobrazí v metadatech jako indexovaná vlastnost s názvem Item. Vývojář knihovny tříd však může pomocí IndexerNameAttribute atributu změnit název indexeru v metadatech. Třída má například String indexer pojmenovaný Chars[]. Indexované vlastnosti vytvořené pomocí jiných jazyků než C# můžou mít jiné názvy než Itema také.

Chcete-li zjistit, zda typ má výchozí vlastnost, použijte metodu GetCustomAttributes(Type, Boolean) k otestování atributu DefaultMemberAttribute . Pokud typ obsahuje DefaultMemberAttribute, vlastnost MemberName vrátí název výchozí vlastnosti.