1
1
using System ;
2
- using System . Collections . Generic ;
3
- using System . Linq ;
4
2
using System . Reflection ;
5
3
using System . Reflection . Emit ;
6
4
using System . Runtime . Serialization ;
@@ -37,6 +35,13 @@ internal static class FieldInterceptorProxyBuilder
37
35
38
36
public static TypeInfo CreateProxyType ( System . Type baseType )
39
37
{
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
+
40
45
// Avoid having a suffix ending with "Proxy", for disambiguation with INHibernateProxy proxies
41
46
var typeName = $ "{ baseType . Name } ProxyForFieldInterceptor";
42
47
var assemblyName = $ "{ typeName } Assembly";
@@ -49,40 +54,25 @@ public static TypeInfo CreateProxyType(System.Type baseType)
49
54
50
55
const TypeAttributes typeAttributes = TypeAttributes . AutoClass | TypeAttributes . Class | TypeAttributes . Public | TypeAttributes . BeforeFieldInit ;
51
56
52
- var interfaces = new HashSet < System . Type >
57
+ var interfaces = new [ ]
53
58
{
54
59
typeof ( IFieldInterceptorAccessor ) ,
55
60
typeof ( ISerializable )
56
61
} ;
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 ) ;
71
63
72
64
var fieldInterceptorField = typeBuilder . DefineField ( "__fieldInterceptor" , FieldInterceptorType , FieldAttributes . Private ) ;
73
65
var proxyInfoField = typeBuilder . DefineField ( "__proxyInfo" , typeof ( NHibernateProxyFactoryInfo ) , FieldAttributes . Private ) ;
74
66
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 ) )
79
70
{
80
71
CreateProxiedMethod ( typeBuilder , method , fieldInterceptorField ) ;
81
72
}
82
73
83
- ProxyBuilderHelper . MakeProxySerializable ( typeBuilder ) ;
84
- ImplementDeserializationConstructor ( typeBuilder , parentType ) ;
85
- ImplementGetObjectData ( typeBuilder , proxyInfoField , fieldInterceptorField , parentType ) ;
74
+ ImplementIFieldInterceptorAccessor ( typeBuilder , fieldInterceptorField ) ;
75
+ ImplementISerializable ( typeBuilder , proxyInfoField , fieldInterceptorField , baseType ) ;
86
76
87
77
var proxyType = typeBuilder . CreateTypeInfo ( ) ;
88
78
@@ -93,15 +83,7 @@ public static TypeInfo CreateProxyType(System.Type baseType)
93
83
94
84
private static void CreateProxiedMethod ( TypeBuilder typeBuilder , MethodInfo method , FieldInfo fieldInterceptorField )
95
85
{
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 ) )
105
87
{
106
88
ImplementGet ( typeBuilder , method , fieldInterceptorField ) ;
107
89
}
@@ -133,6 +115,17 @@ private static void ImplementConstructor(TypeBuilder typeBuilder, System.Type pa
133
115
IL . Emit ( OpCodes . Ret ) ;
134
116
}
135
117
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
+
136
129
private static void ImplementDeserializationConstructor ( TypeBuilder typeBuilder , System . Type parentType )
137
130
{
138
131
var parameterTypes = new [ ] { typeof ( SerializationInfo ) , typeof ( StreamingContext ) } ;
@@ -249,7 +242,13 @@ private static void ImplementGetObjectData(TypeBuilder typeBuilder, FieldInfo pr
249
242
typeBuilder . DefineMethodOverride ( methodBuilder , ProxyBuilderHelper . SerializableGetObjectDataMethod ) ;
250
243
}
251
244
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 )
253
252
{
254
253
// get { return this.__fieldInterceptor; }
255
254
@@ -268,10 +267,10 @@ private static void ImplementGetFieldInterceptor(TypeBuilder typeBuilder, Method
268
267
IL . Emit ( OpCodes . Ldfld , fieldInterceptorField ) ;
269
268
IL . Emit ( OpCodes . Ret ) ;
270
269
271
- typeBuilder . DefineMethodOverride ( getMethod , method ) ;
270
+ typeBuilder . DefineMethodOverride ( getMethod , AccessorTypeFieldInterceptorProperty . GetMethod ) ;
272
271
}
273
272
274
- private static void ImplementSetFieldInterceptor ( TypeBuilder typeBuilder , MethodInfo method , FieldInfo fieldInterceptorField )
273
+ private static void ImplementSetFieldInterceptor ( TypeBuilder typeBuilder , FieldInfo fieldInterceptorField )
275
274
{
276
275
// set { this.__fieldInterceptor = value; }
277
276
@@ -291,7 +290,7 @@ private static void ImplementSetFieldInterceptor(TypeBuilder typeBuilder, Method
291
290
IL . Emit ( OpCodes . Stfld , fieldInterceptorField ) ;
292
291
IL . Emit ( OpCodes . Ret ) ;
293
292
294
- typeBuilder . DefineMethodOverride ( setMethod , method ) ;
293
+ typeBuilder . DefineMethodOverride ( setMethod , AccessorTypeFieldInterceptorProperty . SetMethod ) ;
295
294
}
296
295
297
296
private static void ImplementGet ( TypeBuilder typeBuilder , MethodInfo getter , FieldInfo fieldInterceptorField )
0 commit comments