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