Hi,

I tried to create a minimalist testcase for this, here goes:

In a class library, I have a type like this:

    public class BaseClass<TKey, TValue> where TKey : struct where
TValue : struct
    {
        protected Dictionary<TKey, TValue> staticField = new
Dictionary<TKey, TValue> { { default(TKey), default(TValue) } };
    }

And now, in a separate assembly (console application), I have the
following code:

    public class DerivedClass : BaseClass<int, int>
    {
        public Dictionary<int, int> GetDic() { return staticField; }
    }
    static class Program
    {
        static void Main()
        {
            var asm =
AssemblyDefinition.ReadAssembly(Assembly.GetExecutingAssembly().Location);
            var type = asm.MainModule.Types.Single(t => t.Name ==
"DerivedClass");
            var method = type.Methods.Single(m => m.Name == "GetDic");
            var fieldResolved = ((FieldReference)
method.Body.Instructions.Single(i => i.Operand is
FieldReference).Operand).Resolve();
            var imported =
asm.MainModule.Import(fieldResolved.FieldType);
        }
    }

The last line fails with an InvalidOperationException.

However, if I import the whole field:

    var imported = asm.MainModule.Import(fieldResolved);

and then look at its FieldType, it looks correct — it is the
GenericInstanceType that I expect, with the GenericArguments set to
the GenericParameters of the BaseClass type, all correctly imported to
the other module. Why doesn’t Import() work with the original
FieldType in the same way?

-- 
--
mono-cecil

Reply via email to