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
MakeGenericSelf http://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

Reply via email to