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