Reflexe a obecné typy

Z hlediska reflexe rozdíl mezi obecným typem a běžným typem je, že obecný typ je přidružen k sadě parametrů typu (Pokud se jedná o definici obecného typu) nebo k argumentům typu (Pokud se jedná o konstruovaný typ). Obecná metoda se od běžné metody liší stejným způsobem.

Existují dva klíče pro porozumění, jak reflexe zpracovává obecné typy a metody:

  • Parametry typu definic obecných typů a definice obecných metod jsou reprezentovány instancemi Type třídy.

    Poznámka

    Mnoho vlastností a metod Type má jiné chování, pokud Type objekt představuje parametr obecného typu. Tyto rozdíly jsou zdokumentovány v tématech vlastností a metod. Podívejte se například na IsAutoClass a DeclaringType. Kromě toho jsou některé členy platné pouze v případě, že Type objekt představuje parametr obecného typu. Podívejte se například na GetGenericTypeDefinition.

  • Pokud instance Type představuje obecný typ, obsahuje pole typů, které představují parametry typu (pro definice obecného typu), nebo argumenty typu (pro konstruované typy). Totéž platí pro instanci MethodInfo třídy, která představuje obecnou metodu.

Reflexe poskytuje metody Type a MethodInfo , které umožňují přístup k poli parametrů typu a k určení, zda instance Type představuje parametr typu nebo skutečný typ.

Příklad kódu, který demonstruje popsané metody, naleznete v tématu How to: prozkoumávat and instance Generic Types with reflexe.

Následující diskuze předpokládá znalost s terminologií generických typů, například rozdíl mezi parametry typu a argumenty a otevřenými nebo uzavřenými konstruovanými typy. Další informace najdete v tématu Obecné typy.

Jedná se o obecný typ nebo metodu?

Použijete-li reflexi k prohlédnutí neznámého typu reprezentovaného instancí Type , použijte IsGenericType vlastnost k určení, zda je neznámý typ obecný. Vrátí, true Pokud je typ obecný. Podobně při kontrole neznámé metody reprezentované instancí MethodInfo třídy použijte IsGenericMethod vlastnost k určení, zda je metoda obecná.

Je tento obecný typ nebo definice metody?

Použijte IsGenericTypeDefinition vlastnost k určení, zda Type objekt představuje definici obecného typu, a použijte IsGenericMethodDefinition metodu k určení, zda MethodInfo představuje definici obecné metody.

Definice obecného typu a metody jsou šablony, ze kterých jsou vytvářeny typy instantiable. Obecné typy v knihovně tříd .NET Framework, například Dictionary<TKey,TValue> , jsou definice obecného typu.

Je typ nebo metoda otevřená nebo uzavřená?

Obecný typ nebo metoda jsou uzavřeny, pokud byly nahrazeny typy instantiable pro všechny parametry typu, včetně všech typových parametrů všech nadřazených typů. Můžete vytvořit pouze instanci obecného typu, pokud je zavřena. Type.ContainsGenericParametersVlastnost vrátí, true zda je typ otevřen. Pro metody MethodBase.ContainsGenericParameters metoda provádí stejnou funkci.

Generování uzavřených obecných typů

Po definování obecného typu nebo definice metody použijte MakeGenericType metodu pro vytvoření zavřeného obecného typu nebo MakeGenericMethod metody pro vytvoření MethodInfo pro uzavřenou obecnou metodu.

Získání obecného typu nebo definice metody

Pokud máte otevřený obecný typ nebo metodu, která není obecným typem nebo definicí metody, nemůžete vytvořit jejich instance a nemůžete zadat chybějící parametry typu. Je nutné mít definici obecného typu nebo metody. Použijte GetGenericTypeDefinition metodu k získání definice obecného typu nebo GetGenericMethodDefinition metody pro získání definice obecné metody.

Například pokud máte Type objekt, který představuje Dictionary<int, string> ( Dictionary(Of Integer, String) v Visual Basic) a chcete vytvořit typ Dictionary<string, MyClass> , můžete použít GetGenericTypeDefinition metodu k získání reprezentace Type Dictionary<TKey, TValue> a následné použití MakeGenericType metody k vytvoření Type reprezentace Dictionary<int, MyClass> .

Příklad otevřeného obecného typu, který není obecný typ, naleznete v části "parametr typu nebo argument typu" dále v tomto tématu.

Zkoumání argumentů typu a parametrů typu

Použijte Type.GetGenericArguments metodu k získání pole Type objektů, které reprezentují parametry typu nebo argumenty typu obecného typu, a použijte MethodInfo.GetGenericArguments metodu pro provedení stejné pro obecnou metodu.

Jakmile víte, že Type objekt představuje parametr typu, může odpovědět mnoho dalších otázek. Můžete určit zdroj parametru typu, jeho umístění a jeho omezení.

Parametr typu nebo argument typu

Chcete-li určit, zda je konkrétní prvek pole parametr typu nebo argumentem typu, použijte IsGenericParameter vlastnost. IsGenericParameterVlastnost je, true Pokud je element parametrem typu.

Obecný typ může být otevřen bez definice obecného typu. v takovém případě má kombinaci typů argumentů a parametrů typu. Například v následujícím kódu je třída D odvozena z typu vytvořeného nahrazením prvního parametru typu D pro druhý parametr typu B .

class B<T, U> {}  
class D<V, W> : B<int, V> {}  
Class B(Of T, U)  
End Class  
Class D(Of V, W)  
    Inherits B(Of Integer, V)  
End Class  
generic<typename T, typename U> ref class B {};  
generic<typename V, typename W> ref class D : B<int, V> {};  

Pokud získáte Type objekt představující D<V, W> a použít BaseType vlastnost k získání svého základního typu, je výsledek type B<int, V> otevřen, ale není to definice obecného typu.

Zdroj obecného parametru

Parametr obecného typu může pocházet z typu, který zkoumáte, z nadřazeného typu nebo z obecné metody. Zdroj parametru obecného typu můžete určit následujícím způsobem:

  • Nejprve použijte DeclaringMethod vlastnost k určení, zda parametr typu pochází z obecné metody. Pokud hodnota vlastnosti není odkaz s hodnotou null ( Nothing v Visual Basic), pak je zdrojem obecná metoda.

  • Pokud zdroj není obecná metoda, použijte DeclaringType vlastnost k určení obecného typu, ke kterému parametr obecného typu patří.

Pokud parametr typu patří do obecné metody, DeclaringType vlastnost vrátí typ, který deklaruje obecnou metodu, která je nerelevantní.

Pozice obecného parametru

Ve vzácných situacích je nutné určit pozici parametru typu v seznamu parametrů typu své deklarované třídy. Předpokládejme například, že máte Type objekt reprezentující B<int, V> typ z předchozího příkladu. GetGenericArgumentsMetoda poskytuje seznam argumentů typu a při kontrole V můžete použít DeclaringMethod DeclaringType vlastnosti a k zjištění, odkud pochází. Pak můžete použít GenericParameterPosition vlastnost k určení jeho pozice v seznamu parametrů typu, kde byl definován. V tomto příkladu V je na pozici 0 (nula) v seznamu parametrů typu, kde byl definován.

Základní typ a omezení rozhraní

Použijte GetGenericParameterConstraints metodu pro získání omezení základního typu a omezení rozhraní parametru typu. Pořadí prvků pole není významné. Element představuje omezení rozhraní, pokud se jedná o typ rozhraní.

Obecné atributy parametru

GenericParameterAttributesVlastnost vrací GenericParameterAttributes hodnotu, která označuje odchylku (kovarianci nebo kontravariance) a zvláštní omezení parametru typu.

Kovariance a kontravariance

Chcete-li určit, zda je parametr typu kovariantní nebo kontravariantní, použijte GenericParameterAttributes.VarianceMask masku na GenericParameterAttributes hodnotu, která je vrácena GenericParameterAttributes vlastností. Pokud je výsledek GenericParameterAttributes.None , parametr typu je invariantní. Viz kovariance a kontravariance.

Speciální omezení

Chcete-li určit zvláštní omezení parametru typu, použijte GenericParameterAttributes.SpecialConstraintMask masku na GenericParameterAttributes hodnotu, která je vrácena GenericParameterAttributes vlastností. Pokud je výsledkem GenericParameterAttributes.None , neexistují žádná zvláštní omezení. Parametr typu může být omezen na typ odkazu, na typ hodnoty neumožňující hodnotu null a musí mít konstruktor bez parametrů.

Invariantní

Tabulka neutrálních podmínek pro běžné výrazy v reflexi pro obecné typy naleznete v tématu Type.IsGenericType . Další podmínky týkající se obecných metod naleznete v tématu MethodBase.IsGenericMethod .

Nadpis Popis
Postupy: Prozkoumání a vytvoření instancí obecných typů pomocí reflexe Ukazuje, jak používat vlastnosti a metody Type a MethodInfo k prozkoumávání obecných typů.
Obecné typy Popisuje funkci Generics a způsob jejího podporování v .NET Framework.
Postupy: Definování obecného typu pomocí generování reflexe Ukazuje, jak pomocí generování reflexe generovat obecné typy v dynamických sestaveních.
Zobrazení informací o typu Popisuje Type třídu a poskytuje příklady kódu, které ilustrují, jak použít Type s různými třídami reflexe k získání informací o konstruktorech, metodách, polích, vlastnostech a událostech.