Exemplo n.º 1
0
        public void Generate(ClassEmitter @class, ProxyGenerationOptions options, INamingScope namingScope)
        {
            var baseClass = @class.BaseType;

            foreach (var partType in parts)
            {
                var specificInterface = genericInterface.MakeGenericType(partType);
                var typeBuilder       = @class.TypeBuilder;
                typeBuilder.AddInterfaceImplementation(specificInterface);
                var field        = @class.CreateField(string.Format("_part<{0}>", partType.Name), partType);;
                var partProperty = specificInterface.GetMethod("get_Part", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

                constructorContributor.AppendConstructorStatement(
                    new AssignStatement(field,
                                        new NewInstanceExpression(partType, new Type[0])));

                var getMethodBuilder = typeBuilder.DefineMethod(
                    string.Format("get_Part<{0}>", partType.Name),
                    propertyAttributes, partType, null);

                var getILGenerator = getMethodBuilder.GetILGenerator();

                getILGenerator.Emit(OpCodes.Ldarg_0);
                getILGenerator.Emit(OpCodes.Ldfld, field.Reference);

                getILGenerator.Emit(OpCodes.Ret);

                typeBuilder.DefineMethodOverride(getMethodBuilder, partProperty);
            }
        }
 public override void Generate(ClassEmitter @class, ProxyGenerationOptions options, INamingScope namingScope)
 {
     if (constructorContributor != null && registrar != null)
     {
         foreach (var statement in registrar.ConstructorStatements)
         {
             constructorContributor.AppendConstructorStatement(statement);
         }
     }
     base.Generate(@class, options, namingScope);
 }