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


Önkifejezés ion é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 kulcs használható:

  • 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.

    Feljegyzé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. Lásd például: IsAutoClass vagy 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.

Önkifejezés ion olyan metódusokat 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.

Például az itt tárgyalt módszereket bemutató kód: Útmutató: Általános típusok vizsgálata és példányosítása Önkifejezés ionnal.

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 IsGenericType tulajdonság használatával állapítsa Typemeg, hogy az ismeretlen típus á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 lesz bezárva, ha a példányosítható típusokat az összes típusparaméterre lecserélték, beleértve az összes ide tartozó típusparamétert 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 metódus használatával GetGenericTypeDefinition szerezze be az általános típusdefiníciót vagy a GetGenericMethodDefinition metódust az általános metódusdefiníció beszerzéséhez.

Ha például egy objektumot jelöl, és létre szeretné hozni a típustDictionary<string, MyClass>, akkor a GetGenericTypeDefinition metódussal lekérheti a reprezentálást TypeDictionary<TKey, TValue>, majd a MakeGenericType metódussal létrehozhat egy reprezentálást TypeDictionary<int, MyClass>.Dictionary<int, string>Type

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 osztály D egy olyan típusból származik, amely a második típusparaméter első típusparaméterének D helyettesítésével Bjö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
generic<typename T, typename U> ref class B {};
generic<typename V, typename W> ref class D : B<int, V> {};

Ha a Type tulajdonságot képviselő D<V, W> objektumot szerez be az BaseType alaptípus lekéréséhez, az eredmény type B<int, V> nyitott, de nem á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 felsorolja a típusargumentumokat, és a vizsgálat V során a tulajdonságok és DeclaringType a DeclaringMethod tulajdonságok segítségével felderítheti, 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 Contravariance.

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

Az általános típusok közös kifejezéseinek 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.