public Type CreateProxiedType(ModuleBuilder b, Type baseType, Type[] baseInterfaces) { string typeName = string.Format("{0}Proxy", baseType.Name); // const TypeAttributes attributes = TypeAttributes.BeforeFieldInit | TypeAttributes.AutoClass | TypeAttributes.Public; var interfaces = new List <Type>(); if ((baseInterfaces != null) && (baseInterfaces.Length > 0)) { interfaces.AddRange(baseInterfaces); } var parent = baseType; if (baseType.IsInterface) { parent = typeof(ProxyDummy); interfaces.Add(baseType); } foreach (var @interface in interfaces.ToArray()) { BuildInterfacesRecurse(@interface, interfaces); } if (!interfaces.Contains(typeof(ISerializable))) { interfaces.Add(typeof(ISerializable)); } var typeBuilder = b.DefineType(typeName, attributes, parent, interfaces.ToArray()); var constructorBuilder = DefineConstructor(typeBuilder); var implementor = new DynamicProxyImplementor(); implementor.ImplementProxy(typeBuilder); var methods = baseType.GetMethods(BindingFlags.Public | BindingFlags.Instance); var proxies = new List <MethodInfo>(); BuildMethods(interfaces, methods, proxies); var interceptorField = implementor.InterceptorField; foreach (var proxy in proxies) { if (proxy.DeclaringType != typeof(ISerializable)) { ProxyMethodEmitter.CreateProxiedMethod(typeBuilder, interceptorField, proxy); } } AddSerializationSupport(typeBuilder, baseType, baseInterfaces, interceptorField, constructorBuilder); return(typeBuilder.CreateType()); }
public Type CreateProxiedType(ModuleBuilder b, Type baseType, Type[] baseInterfaces) { string typeName = string.Format("{0}Proxy", baseType.Name); // const TypeAttributes attributes = TypeAttributes.BeforeFieldInit | TypeAttributes.AutoClass | TypeAttributes.Public; var interfaces = new List<Type>(); if ((baseInterfaces != null) && (baseInterfaces.Length > 0)) interfaces.AddRange(baseInterfaces); var parent = baseType; if (baseType.IsInterface) { parent = typeof(ProxyDummy); interfaces.Add(baseType); } foreach (var @interface in interfaces.ToArray()) BuildInterfacesRecurse(@interface, interfaces); if (!interfaces.Contains(typeof(ISerializable))) interfaces.Add(typeof(ISerializable)); var typeBuilder = b.DefineType(typeName, attributes, parent, interfaces.ToArray()); var constructorBuilder = DefineConstructor(typeBuilder); var implementor = new DynamicProxyImplementor(); implementor.ImplementProxy(typeBuilder); var methods = baseType.GetMethods(BindingFlags.Public | BindingFlags.Instance); var proxies = new List<MethodInfo>(); BuildMethods(interfaces, methods, proxies); var interceptorField = implementor.InterceptorField; foreach (var proxy in proxies) if (proxy.DeclaringType != typeof(ISerializable)) ProxyMethodEmitter.CreateProxiedMethod(typeBuilder, interceptorField, proxy); AddSerializationSupport(typeBuilder, baseType, baseInterfaces, interceptorField, constructorBuilder); return typeBuilder.CreateType(); }