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); }