Great stuff! Gabriel
On 6 juin, 16:45, Jb Evain <[email protected]> wrote: > 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]>- Masquer le texte des messages précédents - > > - Afficher le texte des messages précédents - -- -- mono-cecil
