Ö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 B
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
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.
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: