Hey Gabriel, That should be fixed.
Thanks! On Fri, Jun 4, 2010 at 3:12 PM, Gabriel Kevorkian <[email protected]> wrote: > I haven't run the unit tests (I don't have nunit set up on my box) > All I know is this breaks in my specific case with the following > example: > > public class A<T> > { > } > > var assembly = AssemblyDefinition.ReadAssembly > ( > @"MyAssembly.dll", > new ReaderParameters() { ReadSymbols = true } > ); > var type = assembly.MainModule.Types.FirstOrDefault(t => > "A`1".Equals(t.Name)); > var list_of_a_Add = type.Module.Import > ( > typeof(List<>) > .MakeGenericType(typeof(MyAssembly.A<>)) > .GetMethod("Add"), > type > ); > Console.WriteLine(list_of_a_Add.FullName); > > Basically I'm attempting to get hold of method Add() on type > List<A<T>> > With the original implementation, I get > > System.Void System.Collections.Generic.List`1::Add(T) > > as output where I would like to have: > > System.Void > System.Collections.Generic.List`1<MyAssembly.A`1<T>>::Add(T) > > instead (which is what is returned if I reuse declaring_type when > assigning DeclaringType and have generic instance support in > ImportTypeSpecification patched as follows: > > TypeReference ImportTypeSpecification (Type type, IGenericContext > context) > { > if (type.IsByRef) > return new ByReferenceType (ImportType (type.GetElementType (), > context)); > > if (type.IsPointer) > return new PointerType (ImportType (type.GetElementType (), > context)); > > if (type.IsArray) { > var array_type = new ArrayType (ImportType > (type.GetElementType (), > context)); > for (int i = 1; i < type.GetArrayRank (); i++) > array_type.Dimensions.Add (new ArrayDimension ()); > > return array_type; > } > > if (IsGenericInstance (type)) { > return ImportGenericInstance(type, context); > } > > if (type.IsGenericParameter) { > if (context == null) > throw new InvalidOperationException (); > > var owner = type.DeclaringMethod != null > ? context.Method > : context.Type; > > if (owner == null) > throw new InvalidOperationException (); > > return owner.GenericParameters [type.GenericParameterPosition]; > } > > throw new NotSupportedException (type.FullName); > } > > private TypeReference ImportGenericInstance(Type type, IGenericContext > context) > { > var element_type = ImportType(type.GetGenericTypeDefinition(), > context); > var instance = new GenericInstanceType(element_type); > var arguments = type.GetGenericArguments(); > for (int i = 0; i < arguments.Length; i++) > { > TypeReference argument_type; > if (arguments[i].IsGenericTypeDefinition) > argument_type = ImportGenericInstance(arguments[i], > context); > else > argument_type = ImportType(arguments[i], context); > > instance.GenericArguments.Add(argument_type); > } > return instance; > } > > I may be doing something wrong but I cannot seem to find any other > suitable workaround to get my code to work. > > Your help is greatly appreciated > > Gabriel > > > On 4 juin, 14:34, Jb Evain <[email protected]> wrote: >> On Fri, Jun 4, 2010 at 12:47 PM, Gabriel Kevorkian >> >> <[email protected]> wrote: >> > is not correct. >> >> It is. You can run the unit test to verify it. >> >> -- >> Jb Evain <[email protected]> > > -- > -- > mono-cecil > -- Jb Evain <[email protected]> -- -- mono-cecil
