Skip to content

Commit 7b5dd1f

Browse files
hazzikfredericDelaporte
authored andcommitted
Remove copy-paste remnants from FieldInterceptorProxyBuilder
1 parent eec2ee6 commit 7b5dd1f

File tree

2 files changed

+49
-43
lines changed

2 files changed

+49
-43
lines changed

src/NHibernate/Proxy/FieldInterceptorProxyBuilder.cs

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
42
using System.Reflection;
53
using System.Reflection.Emit;
64
using 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)

src/NHibernate/Proxy/ProxyBuilderHelper.cs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,22 @@ internal static void CallDefaultBaseConstructor(ILGenerator il, System.Type pare
8989
il.Emit(OpCodes.Call, baseConstructor);
9090
}
9191

92-
internal static IEnumerable<MethodInfo> GetProxiableMethods(System.Type type, IEnumerable<System.Type> interfaces)
92+
internal static IEnumerable<MethodInfo> GetProxiableMethods(System.Type type)
9393
{
9494
const BindingFlags candidateMethodsBindingFlags =
9595
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
96-
return
97-
type.GetMethods(candidateMethodsBindingFlags)
98-
.Where(method => method.IsProxiable())
99-
.Concat(interfaces.SelectMany(interfaceType => interfaceType.GetMethods()))
100-
.Distinct();
96+
97+
return type.GetMethods(candidateMethodsBindingFlags).Where(m => m.IsProxiable());
98+
}
99+
100+
internal static IEnumerable<MethodInfo> GetProxiableMethods(System.Type type, IEnumerable<System.Type> interfaces)
101+
{
102+
var proxiableMethods =
103+
GetProxiableMethods(type)
104+
.Concat(interfaces.SelectMany(i => i.GetMethods()))
105+
.Distinct();
106+
107+
return proxiableMethods;
101108
}
102109

103110
internal static void MakeProxySerializable(TypeBuilder typeBuilder)

0 commit comments

Comments
 (0)