ModuleDefinition.Read and ModuleDefinition.Import handle generic type
arguments for an open generic type differently. ModuleDefinition.Read does
it correctly while ModuleDenifition.Import does not import the generic
parameter name correctly:

Here's an quick and dirty repro:

        public class StringKeyedDictionary<TValue>
        {
            public static readonly Dictionary<string, TValue> FIELD = null;
        }

        public void Test()
        {
            string code = @"
                using System;
                using System.Collections.Generic;

                public class StringKeyedDictionary<TValue>
                {
                    public static readonly Dictionary<string, TValue> FIELD;
                }";

            using (var x = new TemporaryDirectoryFixture())
            {
                string subject = Path.Combine( x.DirectoryPath,
"library.dll" );
                //CSharpCompiler.Compile( code, subject,
CSharpCompiler.Clr.Two, CSharpCompiler.Target.Library );

                var asm = AssemblyDefinition.ReadAssembly( subject );
                var ty = asm.MainModule.Types.Skip( 1 ).First();
                var read = (GenericInstanceType)ty.Fields.First().FieldType;

                ModuleDefinition dummy = ModuleDefinition.CreateModule(
"asd", ModuleKind.NetModule );
                var import = (GenericInstanceType)dummy.Import( typeof(
StringKeyedDictionary<> ).GetField( "FIELD" ).FieldType );

                Assert.Equal( read.GenericArguments, import.GenericArguments
);
            }

The difference is:

import.GenericArguments.ToList()
Count = 2
    [0]: {System.String}
    [1]: {TKey}
read.GenericArguments.ToList()
Count = 2
    [0]: {System.String}
    [1]: {TValue}

I am positive this has just something to do with the Importer. What are your
thoughts?

-- 
--
mono-cecil

Reply via email to