private Type GenerateType(string name, INamingScope namingScope) { IEnumerable<ITypeContributor> contributors; var implementedInterfaces = GetTypeImplementerMapping(out contributors, namingScope); var model = new MetaType(); // Collect methods foreach (var contributor in contributors) { contributor.CollectElementsToProxy(ProxyGenerationOptions.Hook, model); } ProxyGenerationOptions.Hook.MethodsInspected(); var emitter = BuildClassEmitter(name, targetType, implementedInterfaces); CreateFields(emitter); CreateTypeAttributes(emitter); // Constructor var cctor = GenerateStaticConstructor(emitter); var targetField = CreateTargetField(emitter); var constructorArguments = new List<FieldReference> { targetField }; foreach (var contributor in contributors) { contributor.Generate(emitter, ProxyGenerationOptions); // TODO: redo it if (contributor is MixinContributor) { constructorArguments.AddRange((contributor as MixinContributor).Fields); } } // constructor arguments var interceptorsField = emitter.GetField("__interceptors"); constructorArguments.Add(interceptorsField); var selector = emitter.GetField("__selector"); if (selector != null) { constructorArguments.Add(selector); } GenerateConstructors(emitter, targetType, constructorArguments.ToArray()); GenerateParameterlessConstructor(emitter, targetType, interceptorsField); // Complete type initializer code body CompleteInitCacheMethod(cctor.CodeBuilder); // Crosses fingers and build type Type proxyType = emitter.BuildType(); InitializeStaticFields(proxyType); return proxyType; }
protected override Type GenerateType(string typeName, Type proxyTargetType, Type[] interfaces, INamingScope namingScope) { IEnumerable<ITypeContributor> contributors; var allInterfaces = GetTypeImplementerMapping(interfaces, targetType, out contributors, namingScope); var model = new MetaType(); // collect elements foreach (var contributor in contributors) { contributor.CollectElementsToProxy(ProxyGenerationOptions.Hook, model); } ProxyGenerationOptions.Hook.MethodsInspected(); ClassEmitter emitter; FieldReference interceptorsField; var baseType = Init(typeName, out emitter, proxyTargetType, out interceptorsField, allInterfaces); // Constructor var cctor = GenerateStaticConstructor(emitter); var mixinFieldsList = new List<FieldReference>(); foreach (var contributor in contributors) { contributor.Generate(emitter, ProxyGenerationOptions); // TODO: redo it if (contributor is MixinContributor) { mixinFieldsList.AddRange((contributor as MixinContributor).Fields); } } var ctorArguments = new List<FieldReference>(mixinFieldsList) { interceptorsField, targetField }; var selector = emitter.GetField("__selector"); if (selector != null) { ctorArguments.Add(selector); } GenerateConstructors(emitter, baseType, ctorArguments.ToArray()); // Complete type initializer code body CompleteInitCacheMethod(cctor.CodeBuilder); // Crosses fingers and build type var generatedType = emitter.BuildType(); InitializeStaticFields(generatedType); return generatedType; }
public void CollectElementsToProxy(IProxyGenerationHook hook, MetaType model) { foreach (var collector in CollectElementsToProxyInternal(hook)) { foreach (var method in collector.Methods) { model.AddMethod(method); methods.Add(method); } foreach (var @event in collector.Events) { model.AddEvent(@event); events.Add(@event); } foreach (var property in collector.Properties) { model.AddProperty(property); properties.Add(property); } } }
protected override Type GenerateType(string typeName, Type proxyTargetType, Type[] interfaces, INamingScope namingScope) { IEnumerable<ITypeContributor> contributors; ClassEmitter emitter; FieldReference interceptorsField; IEnumerable<Type> allInterfaces = this.GetTypeImplementerMapping(interfaces, base.targetType, out contributors, namingScope); MetaType model = new MetaType(); foreach (ITypeContributor contributor in contributors) { contributor.CollectElementsToProxy(base.ProxyGenerationOptions.Hook, model); } base.ProxyGenerationOptions.Hook.MethodsInspected(); Type baseType = this.Init(typeName, out emitter, proxyTargetType, out interceptorsField, allInterfaces); ConstructorEmitter cctor = base.GenerateStaticConstructor(emitter); List<FieldReference> mixinFieldsList = new List<FieldReference>(); foreach (ITypeContributor contributor in contributors) { contributor.Generate(emitter, base.ProxyGenerationOptions); if (contributor is MixinContributor) { mixinFieldsList.AddRange((contributor as MixinContributor).Fields); } } List<FieldReference> g__initLocalc = new List<FieldReference>(mixinFieldsList) { interceptorsField, base.targetField }; List<FieldReference> ctorArguments = g__initLocalc; FieldReference selector = emitter.GetField("__selector"); if (selector != null) { ctorArguments.Add(selector); } base.GenerateConstructors(emitter, baseType, ctorArguments.ToArray()); base.CompleteInitCacheMethod(cctor.CodeBuilder); Type generatedType = emitter.BuildType(); base.InitializeStaticFields(generatedType); return generatedType; }
public void CollectElementsToProxy(IProxyGenerationHook hook, MetaType model) { foreach (var collector in CollectElementsToProxyInternal(hook)) { foreach (var method in collector.Methods) { if (!IsInterceptable(collector, method.Method)) continue; model.AddMethod(method); methods.Add(method); } foreach (var @event in collector.Events) { if (!IsInterceptable(collector, @event.Event)) continue; model.AddEvent(@event); events.Add(@event); } foreach (var property in collector.Properties) { if (!IsInterceptable(collector, property.Property)) continue; model.AddProperty(property); properties.Add(property); foreach (var method in collector.Methods .Where(m => (property.CanRead && m.Method == property.GetMethod) || (property.CanWrite && m.Method == property.SetMethod))) { model.AddMethod(method); methods.Add(method); } } } }
public void CollectElementsToProxy(IProxyGenerationHook hook, MetaType model) { }
public void CollectElementsToProxy(Castle.DynamicProxy.IProxyGenerationHook hook, Castle.DynamicProxy.Generators.MetaType model) { }
private Type GenerateType(string name, INamingScope namingScope) { IEnumerable <ITypeContributor> contributors; var implementedInterfaces = GetTypeImplementerMapping(out contributors, namingScope); var model = new MetaType(); // Collect methods foreach (var contributor in contributors) { contributor.CollectElementsToProxy(ProxyGenerationOptions.Hook, model); } ProxyGenerationOptions.Hook.MethodsInspected(); var emitter = BuildClassEmitter(name, targetType, implementedInterfaces); CreateFields(emitter); CreateTypeAttributes(emitter); // Constructor var cctor = GenerateStaticConstructor(emitter); var targetField = CreateTargetField(emitter); var constructorArguments = new List <FieldReference> { targetField }; foreach (var contributor in contributors) { contributor.Generate(emitter, ProxyGenerationOptions); // TODO: redo it if (contributor is MixinContributor) { constructorArguments.AddRange((contributor as MixinContributor).Fields); } } // constructor arguments var interceptorsField = emitter.GetField("__interceptors"); constructorArguments.Add(interceptorsField); var selector = emitter.GetField("__selector"); if (selector != null) { constructorArguments.Add(selector); } GenerateConstructors(emitter, targetType, constructorArguments.ToArray()); GenerateParameterlessConstructor(emitter, targetType, interceptorsField); // Complete type initializer code body CompleteInitCacheMethod(cctor.CodeBuilder); // Crosses fingers and build type var proxyType = emitter.BuildType(); InitializeStaticFields(proxyType); return(proxyType); }