Snažím sa dostať ldtoken
Metóda IL na načítanie generickej inštancie generickej metódy v generickej triede (povedzme, List.ConvertAll<TOutput>
):
ldtoken method instance
class [mscorlib]System.Collections.Generic.List`1<!!0>
[mscorlib]System.Collections.Generic.List`1::ConvertAll<string>(
class [mscorlib]System.Converter`2<!0,!!0>)
Výsledkom je výnimka:
Neošetřená výnimka: System.TypeLoadException: Nepodarilo sa načítať typ „System.Collections.Generic.List`1“ zo zostavy „TestAssembly, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null“.
Vyzerá to v mojej testovacej zostave System.Collections.Generic.List
, aj keď je to výslovne uvedené v mscorlib
!
Načítanie neinštantovaného tokenu metódy však funguje:
ldtoken method instance
class [mscorlib]System.Collections.Generic.List`1<!!0>
[mscorlib]System.Collections.Generic.List`1::ConvertAll<[1]>(
class [mscorlib]System.Converter`2<!0,!!0>)
Generická metóda v neštandardných prácach v triede:
ldtoken method void [mscorlib]System.Array::Sort<object>(!!0[])
ldtoken method void [mscorlib]System.Array::Sort<[1]>(!!0[])
Čo sa deje? Je to chyba v .NET? (Replikoval som ju na CLR v2 a v4).
odpovede:
1 pre odpoveď č. 1Ako som spomenul v poznámke, myslím si, že musíte vytvoriť inštančný druh (t. J. Neexistuje taký typ ako System.Collections.Generic.List`1
- jednoducho System.Collections.Generic.List`1<object>
, atď.).
Pri hraní so systémom System.Reflection.Emit sa zdá, že je možné použiť ldtoken s okamžitou alebo neodstránenou metódou na vytvorenom generickom type:
Inštancia metódy ldtoken systém triedy [mscorlib].Collections.Generic.List`1 <!! 0> class [mscorlib] System.Collections.Generic.List`1 <object> :: ConvertAll <[1]> ( class [mscorlib] System.Converter`2 <! 0, !! 0>) Inštancia metódy ldtoken class [mscorlib] System.Collections.Generic.List`1 <!! 0> class [mscorlib] System.Collections.Generic.List`1 <object> :: ConvertAll <string> ( class [mscorlib] System.Converter`2 <! 0, !! 0>)
ale nie s neurčitým generickým typom. V oddiele II oddiele 9.4 špecifikácie ECMA CLI sa uvádza, že:
CLI nepodporuje čiastočnú inštanciu generických typov. a generické typy sa v metaúdajoch nemusia objaviť nikde inde podpisové guľky.
takže to asi nie je prekvapujúce - zdá sa, že neexistuje spôsob, ako používať ldtoken s ekvivalentom typeof(List<>).GetMethod("ConvertAll")
.