/ / .NET bug: ldtoken inštancovanej generickej metódy - .net, generics, cil

.NET chyba: ldtoken generickej metódy inštancie - .net, generics, cil

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ď č. 1

Ako 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").