Megosztás a következőn keresztül:


Tükröződés és általános típusok

A visszatükrözés szempontjából az általános típus és a szokásos típus közötti különbség az, hogy egy általános típus típusparamétereket (ha általános típusdefiníció) vagy típusargumentumokat társított hozzá (ha ez egy létrehozott típus). Az általános metódusok ugyanúgy különböznek a szokásos metódusoktól.

Az általános típusok és metódusok kezelésének megértéséhez két szempont létezik:

  • Az általános típusdefiníciók és az általános metódusdefiníciók típusparamétereit az Type osztály példányai jelölik.

    Megjegyzés:

    Számos tulajdonság és metódus eltérő viselkedéssel Type rendelkezik, ha egy Type objektum általános típusparamétert jelöl. Ezeket a különbségeket a tulajdonság- és metóduscikkek dokumentálják. Például lásd IsAutoClass és DeclaringType. Emellett egyes tagok csak akkor érvényesek, ha egy Type objektum általános típusparamétert jelöl. Lásd például: GetGenericTypeDefinition.

  • Ha egy példány Type egy általános típust jelöl, akkor a típusparamétereket (általános típusdefiníciók esetén) vagy a típusargumentumokat (az épített típusok esetében) képviselő típusparamétereket tartalmazó tömböt tartalmaz. Ugyanez igaz az általános metódust képviselő osztálypéldányra MethodInfo is.

A reflexió olyan módszereket Type biztosít, MethodInfo amelyek lehetővé teszik a típusparaméterek tömbjének elérését, valamint annak megállapítását, hogy egy példány Type típusparamétert vagy tényleges típust jelöl-e.

Az itt tárgyalt módszereket bemutató kód például a How to: Examine and Instantiate Generic Types with Reflection (Általános típusok vizsgálata és példányosítása tükröződéssel) című témakörben található.

Az alábbi vita feltételezi az általános kifejezések terminológiájának ismeretét, például a típusparaméterek és az argumentumok, valamint a nyitott vagy zárt típusok közötti különbséget. További információ: Generics.

Ez egy általános típus vagy metódus?

Ha a tükröződés segítségével megvizsgál egy ismeretlen típust, amelyet egy példány jelöl, a Type tulajdonság használatával állapítsa meg, hogy az ismeretlen típus IsGenericType általános-e. Akkor ad true vissza, ha a típus általános. Hasonlóképpen, ha egy ismeretlen metódust vizsgál meg, amelyet az MethodInfo osztály egy példánya jelöl, a IsGenericMethod tulajdonság segítségével állapítsa meg, hogy a metódus általános-e.

Ez egy általános típus- vagy metódusdefiníció?

IsGenericTypeDefinition A tulajdonság segítségével megállapíthatja, hogy egy Type objektum általános típusdefiníciót jelöl-e, és a IsGenericMethodDefinition metódussal meghatározhatja, hogy egy MethodInfo általános metódusdefiníciót jelöl-e.

Az általános típus- és metódusdefiníciók azok a sablonok, amelyekből létrehozhatók a példányosítható típusok. A .NET-kódtárak általános típusai, például Dictionary<TKey,TValue>általános típusdefiníciók.

Nyitott vagy bezárt a típus vagy a metódus?

Egy általános típus vagy metódus akkor van lezárva, ha a példányosítható típusokat az összes típusparaméterére lecserélték, beleértve az összes körülvevő típus összes típusparaméterét is. Csak akkor hozhat létre általános típusú példányt, ha az bezárva van. A Type.ContainsGenericParameters tulajdonság akkor ad true vissza, ha egy típus meg van nyitva. Metódusok esetén a MethodBase.ContainsGenericParameters metódus ugyanazt a függvényt hajtja végre.

Zárt általános típusok létrehozása

Ha már rendelkezik egy általános típussal vagy metódusdefinícióval, a MakeGenericType metódussal hozzon létre egy zárt általános típust, vagy a MakeGenericMethod metódussal hozzon létre egy MethodInfo zárt általános metódust.

Az általános típus vagy metódus definíciójának lekérése

Ha olyan nyitott általános típussal vagy metódussal rendelkezik, amely nem általános típus vagy metódusdefiníció, nem hozhat létre példányokat, és nem adhatja meg a hiányzó típusparamétereket. Általános típus- vagy metódusdefinícióval kell rendelkeznie. A GetGenericTypeDefinition metódust használja az általános típusdefiníció beszerzésére, vagy a GetGenericMethodDefinition metódust az általános metódusdefiníció beszerzésére.

Ha például van egy Type objektum, amely jelzi Dictionary<int, string>, és létre szeretné hozni a Dictionary<string, MyClass> típust, akkor a GetGenericTypeDefinition metódussal lekérhet egy Type objektumot, amely reprezentálja Dictionary<TKey, TValue>, majd a MakeGenericType metódussal létrehozhat egy Type objektumot, amely reprezentálja Dictionary<int, MyClass>.

Egy nem általános típusú nyitott általános típusra példa: Típusparaméter vagy típusargumentum.

Típusargumentumok és típusparaméterek vizsgálata

Type.GetGenericArguments A metódussal olyan objektumtömböt Type szerezhet be, amely egy általános típus típusparamétereit vagy típusargumentumait képviseli, és a MethodInfo.GetGenericArguments metódussal ugyanezt teszi egy általános metódus esetében is.

Ha már tudja, hogy egy Type objektum típusparamétert jelöl, számos további kérdés megválaszolható. Meghatározhatja a típusparaméter forrását, pozícióját és korlátait.

Típusparaméter vagy típusargumentum

Annak megállapításához, hogy a tömb egy adott eleme típusparaméter vagy típusargumentum-e, használja a tulajdonságot IsGenericParameter . A IsGenericParameter tulajdonság az, true ha az elem típusparaméter.

Az általános típus anélkül nyitható meg, hogy általános típusdefiníció lenne, ebben az esetben típusargumentumok és típusparaméterek keverékével rendelkezik. Az alábbi kódban például az D osztály egy olyan típusból származik, amely az D első típusparaméterének B második típusparaméterével történő helyettesítésével jön létre.

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

Ha beszerez egy Type objektumot, amely D<V, W>-t reprezentálja, és a BaseType tulajdonságot használja az alaptípus lekérdezéséhez, az eredményül kapott type B<int, V> nyitott, de nem egy általános típusdefiníció.

Általános paraméter forrása

Az általános típusparaméter származhat a vizsgált típusból, egy beágyazási típusból vagy egy általános metódusból. Az általános típusparaméter forrását az alábbiak szerint határozhatja meg:

  • Először a DeclaringMethod tulajdonság használatával állapítsa meg, hogy a típusparaméter általános metódusból származik-e. Ha a tulajdonság értéke nem null értékű hivatkozás, akkor a forrás egy általános módszer.
  • Ha a forrás nem általános módszer, a DeclaringType tulajdonság használatával állapítsa meg, hogy az általános típusparaméter melyik általános típushoz tartozik.

Ha a típusparaméter egy általános metódushoz tartozik, a tulajdonság azt DeclaringType a típust adja vissza, amely az általános metódust deklarálta, ami irreleváns.

Általános paraméter pozíciója

Ritka esetekben meg kell határozni egy típusparaméter pozícióját a deklarálási osztály típusparaméter-listájában. Tegyük fel például, hogy az előző példában szereplő típust Type képviselő B<int, V> objektummal rendelkezik. A GetGenericArguments metódus egy listát ad a típusargumentumokkal, és amikor megvizsgálja V, akkor a DeclaringMethod és DeclaringType tulajdonságok segítségével felfedezheti, hogy honnan származik. Ezután a GenericParameterPosition tulajdonság segítségével meghatározhatja a tulajdonság pozícióját abban a típusparaméter-listában, ahol definiálták. Ebben a példában V a típusparaméter-listában a 0 (nulla) pozícióban van, ahol definiálták.

Alaptípus- és felületkorlátozások

A metódussal GetGenericParameterConstraints lekérjük egy típusparaméter alaptípus-korlátozásait és felületi korlátait. A tömb elemeinek sorrendje nem jelentős. Az elemek interfész-kényszert jelölnek, ha interfésztípusról van szó.

Általános paraméterattribútumok

A GenericParameterAttributes tulajdonság olyan GenericParameterAttributes értéket kap, amely a varianciát (kovariancia vagy ellenvariancia) és a típusparaméter speciális korlátait jelzi.

Kovariancia és ellenvariancia

Annak megállapításához, hogy egy típusparaméter kovariant vagy contravariant, alkalmazza a GenericParameterAttributes.VarianceMask maszkot a GenericParameterAttributesGenericParameterAttributes tulajdonság által visszaadott értékre. Ha az eredmény az GenericParameterAttributes.None, a típusparaméter invariáns. További információ: Kovariancia és kontravariancia.

Speciális korlátozások

Egy típusparaméter speciális korlátainak meghatározásához alkalmazza a GenericParameterAttributes.SpecialConstraintMask maszkot a GenericParameterAttributes tulajdonság által visszaadott GenericParameterAttributes értékre. Ha az eredmény az GenericParameterAttributes.None, nincsenek speciális korlátozások. A típusparaméterek hivatkozástípusként, nem null értékű típusként és paraméter nélküli konstruktorként is korlátozhatók.

Invariánsok

A generikus típusok esetében a közös kifejezések invariáns feltételeinek táblázatát lásd: Type.IsGenericType. Az általános módszerekkel kapcsolatos további kifejezésekért lásd: MethodBase.IsGenericMethod.