:) My mistake :))

        public static GenericInstanceType MakeGenericSelf(this
TypeReference typeRef)
        {
            var genType = new GenericInstanceType(typeRef);
            foreach (var p in typeRef.GenericParameters)
                genType.GenericArguments.Add(p);
            return genType;
        }

On 25 май, 13:32, Gábor Kozár <[email protected]> wrote:
> What is your MakeGenericSelf() extension method? I did not write it, I'm
> quite positive about it (the linked code only contains various Reference*
> extension methods, that I did write).
>
> Anyway, I see only one problem on this side (although you haven't shown the
> code which emits the IL that actually uses the Utils class you inject here):
>
> utils = new TypeDefinition(declaringType.FullName, "<>_Utils",
> TypeAttributes.NestedAssembly | TypeAttributes.Sealed | TypeAttributes.Class
> | TypeAttributes.Abstract, declaringType.Module.GetType<Object>())
>        {
>              DeclaringType = resolvedType // here! DeclaringType should be
> set to the original, generic TypeReference, NOT the resolved TypeDefinition
>        };
>
> 2011/5/25 Stanislav <[email protected]>
>
>
>
>
>
>
>
> > I have a problem making generics. I cannot insert nongeneric class
> > into generic class as nested. For ex:
>
> > Orriginally I have class GenericClass<T>
>
> >  public class Something
> >  {
> >    public class GenericClass<T>
> >    {
> >        public SomeProperty<T> { get; set; }
> >    }
> >  }
> > but when I try to insert new nested class into GenericClass<T>, I
> > whant to get result:
>
> >  public class Something
> >  {
> >    public class GenericClass<T>
> >    {
> >        private static class Utils
> >        {
> >            private static Utils() { /* ... */ }
> >            public static string field;
> >        }
> >        public SomeProperty<T> {
> >          get { return field; }
> >          set { /* ... */ }
> >        }
> >    }
> >  }
>
> > But in SomeProperty getter I have wrong accessing to GenericClass
> > field:
>
> > Something.GenericClass<>.Utils.field;
>
> > generic class GenericClass<> is not instanciated by type.
>
> > How do I add nested type (here I use Gabor Kozar's method
> > MakeGenericSelfhttp://pastebin.com/BTX3AvpV)?
>
> > var genericOwnerType = declaringType.HasGenericParameters ?
> > declaringType.MakeGenericSelf() : null;
> > var resolvedType = genericOwnerType == null ?
> > declaringType.Resolve() : genericOwnerType.Resolve();
>
> > utils = new TypeDefinition(declaringType.FullName, "<>_Utils",
> >                           TypeAttributes.NestedAssembly |
> > TypeAttributes.Sealed | TypeAttributes.Class |
> >                           TypeAttributes.Abstract,
> > declaringType.Module.GetType<Object>())
> >        {
> >            DeclaringType = resolvedType
> >        };
>
> >        resolvedType.NestedTypes.Add(utils);
> >        var utilsCctor = new MethodDefinition(".cctor",
> > MethodAttributes.SpecialName |
> >                             MethodAttributes.RTSpecialName |
> > MethodAttributes.HideBySig |
> >                             MethodAttributes.Static,
> > declaringType.Module.GetVoidType());
>
> > utilsCctor.Body.Instructions.Add(Instruction.Create(OpCodes.Ret));
> >        utils.Methods.Add(utilsCctor);
> >        m_utilsClasses.Add(declaringType, utils);
>
> > Whats wrong?
>
> > On 25 май, 07:23, Stanislav <[email protected]> wrote:
> > > No, no, all is ok )))) Thank you very much for great help!
>
> > > On 24 май, 14:12, Gábor Kozár <[email protected]> wrote:
>
> > > > I agree, it's not very intuitive, but that's how it works. You may
> > write
> > > > extension methods, or use ones that I've shown in the discussion to
> > ease the
> > > > problem.
> > > > If you can implement it better, please go ahead.
>
> > > > 2011/5/24 Stanislav <[email protected]>
>
> > > > > > when you Resolve() a TypeReference or MethodReference (or any
> > > > > > other reference), you loose all generic arguments. You have to then
> > > > > restore
> > > > > > those generic arguments by essentially cloning the MethodReference
> > (in
> > > > > your
> > > > > > case), except setting its DeclaringType to the original
> > TypeReference
> > > > > (which
> > > > > > still contains the generic arguments).
>
> > > > > It looks like bug, not as feature )
>
> > > > > --
> > > > > --
> > > > > mono-cecil
>
> > --
> > --
> > mono-cecil

-- 
--
mono-cecil

Reply via email to