11using System ;
2- using System . Collections . Generic ;
3- using System . Linq ;
42using System . Reflection ;
53using System . Reflection . Emit ;
64using System . Runtime . Serialization ;
@@ -37,6 +35,13 @@ internal static class FieldInterceptorProxyBuilder
3735
3836 public static TypeInfo CreateProxyType ( System . Type baseType )
3937 {
38+ if ( baseType . IsInterface )
39+ {
40+ throw new ArgumentException (
41+ $ "Field interceptor proxy does not support being build on an interface baseType ({ baseType . FullName } ).",
42+ nameof ( baseType ) ) ;
43+ }
44+
4045 // Avoid having a suffix ending with "Proxy", for disambiguation with INHibernateProxy proxies
4146 var typeName = $ "{ baseType . Name } ProxyForFieldInterceptor";
4247 var assemblyName = $ "{ typeName } Assembly";
@@ -49,40 +54,25 @@ public static TypeInfo CreateProxyType(System.Type baseType)
4954
5055 const TypeAttributes typeAttributes = TypeAttributes . AutoClass | TypeAttributes . Class | TypeAttributes . Public | TypeAttributes . BeforeFieldInit ;
5156
52- var interfaces = new HashSet < System . Type >
57+ var interfaces = new [ ]
5358 {
5459 typeof ( IFieldInterceptorAccessor ) ,
5560 typeof ( ISerializable )
5661 } ;
57-
58- // Use the object as the base type
59- // since we're not inheriting from any class type
60- var parentType = baseType ;
61- if ( baseType . IsInterface )
62- {
63- throw new ArgumentException (
64- $ "Field interceptor proxy does not support being build on an interface baseType ({ baseType . FullName } ).",
65- nameof ( baseType ) ) ;
66- }
67-
68- interfaces . RemoveWhere ( i => ! i . IsVisible ) ;
69-
70- var typeBuilder = moduleBuilder . DefineType ( typeName , typeAttributes , parentType , interfaces . ToArray ( ) ) ;
62+ var typeBuilder = moduleBuilder . DefineType ( typeName , typeAttributes , baseType , interfaces ) ;
7163
7264 var fieldInterceptorField = typeBuilder . DefineField ( "__fieldInterceptor" , FieldInterceptorType , FieldAttributes . Private ) ;
7365 var proxyInfoField = typeBuilder . DefineField ( "__proxyInfo" , typeof ( NHibernateProxyFactoryInfo ) , FieldAttributes . Private ) ;
7466
75- ImplementConstructor ( typeBuilder , parentType , proxyInfoField ) ;
76-
77- // Provide a custom implementation of ISerializable instead of redirecting it back to the interceptor
78- foreach ( var method in ProxyBuilderHelper . GetProxiableMethods ( baseType , interfaces . Except ( new [ ] { typeof ( ISerializable ) } ) ) )
67+ ImplementConstructor ( typeBuilder , baseType , proxyInfoField ) ;
68+
69+ foreach ( var method in ProxyBuilderHelper . GetProxiableMethods ( baseType ) )
7970 {
8071 CreateProxiedMethod ( typeBuilder , method , fieldInterceptorField ) ;
8172 }
8273
83- ProxyBuilderHelper . MakeProxySerializable ( typeBuilder ) ;
84- ImplementDeserializationConstructor ( typeBuilder , parentType ) ;
85- ImplementGetObjectData ( typeBuilder , proxyInfoField , fieldInterceptorField , parentType ) ;
74+ ImplementIFieldInterceptorAccessor ( typeBuilder , fieldInterceptorField ) ;
75+ ImplementISerializable ( typeBuilder , proxyInfoField , fieldInterceptorField , baseType ) ;
8676
8777 var proxyType = typeBuilder . CreateTypeInfo ( ) ;
8878
@@ -93,15 +83,7 @@ public static TypeInfo CreateProxyType(System.Type baseType)
9383
9484 private static void CreateProxiedMethod ( TypeBuilder typeBuilder , MethodInfo method , FieldInfo fieldInterceptorField )
9585 {
96- if ( method == AccessorTypeFieldInterceptorProperty . GetMethod )
97- {
98- ImplementGetFieldInterceptor ( typeBuilder , method , fieldInterceptorField ) ;
99- }
100- else if ( method == AccessorTypeFieldInterceptorProperty . SetMethod )
101- {
102- ImplementSetFieldInterceptor ( typeBuilder , method , fieldInterceptorField ) ;
103- }
104- else if ( ReflectHelper . IsPropertyGet ( method ) )
86+ if ( ReflectHelper . IsPropertyGet ( method ) )
10587 {
10688 ImplementGet ( typeBuilder , method , fieldInterceptorField ) ;
10789 }
@@ -133,6 +115,17 @@ private static void ImplementConstructor(TypeBuilder typeBuilder, System.Type pa
133115 IL . Emit ( OpCodes . Ret ) ;
134116 }
135117
118+ private static void ImplementISerializable (
119+ TypeBuilder typeBuilder ,
120+ FieldInfo proxyInfoField ,
121+ FieldInfo fieldInterceptorField ,
122+ System . Type baseType )
123+ {
124+ ProxyBuilderHelper . MakeProxySerializable ( typeBuilder ) ;
125+ ImplementDeserializationConstructor ( typeBuilder , baseType ) ;
126+ ImplementGetObjectData ( typeBuilder , proxyInfoField , fieldInterceptorField , baseType ) ;
127+ }
128+
136129 private static void ImplementDeserializationConstructor ( TypeBuilder typeBuilder , System . Type parentType )
137130 {
138131 var parameterTypes = new [ ] { typeof ( SerializationInfo ) , typeof ( StreamingContext ) } ;
@@ -249,7 +242,13 @@ private static void ImplementGetObjectData(TypeBuilder typeBuilder, FieldInfo pr
249242 typeBuilder . DefineMethodOverride ( methodBuilder , ProxyBuilderHelper . SerializableGetObjectDataMethod ) ;
250243 }
251244
252- private static void ImplementGetFieldInterceptor ( TypeBuilder typeBuilder , MethodInfo method , FieldInfo fieldInterceptorField )
245+ private static void ImplementIFieldInterceptorAccessor ( TypeBuilder typeBuilder , FieldInfo fieldInterceptorField )
246+ {
247+ ImplementGetFieldInterceptor ( typeBuilder , fieldInterceptorField ) ;
248+ ImplementSetFieldInterceptor ( typeBuilder , fieldInterceptorField ) ;
249+ }
250+
251+ private static void ImplementGetFieldInterceptor ( TypeBuilder typeBuilder , FieldInfo fieldInterceptorField )
253252 {
254253 // get { return this.__fieldInterceptor; }
255254
@@ -268,10 +267,10 @@ private static void ImplementGetFieldInterceptor(TypeBuilder typeBuilder, Method
268267 IL . Emit ( OpCodes . Ldfld , fieldInterceptorField ) ;
269268 IL . Emit ( OpCodes . Ret ) ;
270269
271- typeBuilder . DefineMethodOverride ( getMethod , method ) ;
270+ typeBuilder . DefineMethodOverride ( getMethod , AccessorTypeFieldInterceptorProperty . GetMethod ) ;
272271 }
273272
274- private static void ImplementSetFieldInterceptor ( TypeBuilder typeBuilder , MethodInfo method , FieldInfo fieldInterceptorField )
273+ private static void ImplementSetFieldInterceptor ( TypeBuilder typeBuilder , FieldInfo fieldInterceptorField )
275274 {
276275 // set { this.__fieldInterceptor = value; }
277276
@@ -291,7 +290,7 @@ private static void ImplementSetFieldInterceptor(TypeBuilder typeBuilder, Method
291290 IL . Emit ( OpCodes . Stfld , fieldInterceptorField ) ;
292291 IL . Emit ( OpCodes . Ret ) ;
293292
294- typeBuilder . DefineMethodOverride ( setMethod , method ) ;
293+ typeBuilder . DefineMethodOverride ( setMethod , AccessorTypeFieldInterceptorProperty . SetMethod ) ;
295294 }
296295
297296 private static void ImplementGet ( TypeBuilder typeBuilder , MethodInfo getter , FieldInfo fieldInterceptorField )
0 commit comments