Ejemplo n.º 1
0
        private INamedTypeDefinition GenerateTypeA(IUnitNamespace rootNamespace)
        {
            var nt    = Host.NameTable;
            var typeA = new NamespaceTypeDefinition
            {
                ContainingUnitNamespace = rootNamespace,
                Name          = nt.GetNameFor("A"),
                InternFactory = Host.InternFactory,
                IsClass       = true
            };
            var typeParameter = new GenericTypeParameter
            {
                Name          = nt.GetNameFor("T"),
                InternFactory = Host.InternFactory,
                DefiningType  = typeA,
            };

            typeA.GenericParameters.Add(typeParameter);

            var baseGetMethod = new MethodDefinition
            {
                Name       = nt.GetNameFor("Get"),
                IsCil      = true,
                IsVirtual  = true,
                Visibility = TypeMemberVisibility.Assembly,
                Type       = typeParameter,
                ContainingTypeDefinition = typeA,
                InternFactory            = Host.InternFactory,
                IsNewSlot = true
            };

            typeA.Methods.Add(baseGetMethod);

            var il       = new ILGenerator(Host);
            var localVar = new LocalDefinition
            {
                Type = typeParameter,
                Name = nt.GetNameFor("local1"),
            };

            // tricky moment, ILGeneratorMethodBody fills internal collection of local vars only in constructor.
            // lines below should not be swapped

            il.AddVariableToCurrentScope(localVar);
            var body = new ILGeneratorMethodBody(il, true, 1)
            {
                MethodDefinition = baseGetMethod
            };

            baseGetMethod.Body = body;


            il.Emit(OperationCode.Ldloca, localVar);
            il.Emit(OperationCode.Initobj, typeParameter);
            il.Emit(OperationCode.Ldloc_0);
            il.Emit(OperationCode.Ret);

            return(typeA);
        }