diff --git a/src/Castle.Core/DynamicProxy/Contributors/ClassMembersCollector.cs b/src/Castle.Core/DynamicProxy/Contributors/ClassMembersCollector.cs
index 1200cdae51..40f304273a 100644
--- a/src/Castle.Core/DynamicProxy/Contributors/ClassMembersCollector.cs
+++ b/src/Castle.Core/DynamicProxy/Contributors/ClassMembersCollector.cs
@@ -28,11 +28,6 @@ public ClassMembersCollector(Type targetType)
protected override MetaMethod GetMethodToGenerate(MethodInfo method, IProxyGenerationHook hook, bool isStandalone)
{
- if (ProxyUtil.IsAccessibleMethod(method) == false)
- {
- return null;
- }
-
var accepted = AcceptMethod(method, true, hook);
if (!accepted && !method.IsAbstract)
{
diff --git a/src/Castle.Core/DynamicProxy/Contributors/InterfaceMembersCollector.cs b/src/Castle.Core/DynamicProxy/Contributors/InterfaceMembersCollector.cs
index f3044c45a4..81d998dbd0 100644
--- a/src/Castle.Core/DynamicProxy/Contributors/InterfaceMembersCollector.cs
+++ b/src/Castle.Core/DynamicProxy/Contributors/InterfaceMembersCollector.cs
@@ -28,11 +28,6 @@ public InterfaceMembersCollector(Type @interface)
protected override MetaMethod GetMethodToGenerate(MethodInfo method, IProxyGenerationHook hook, bool isStandalone)
{
- if (ProxyUtil.IsAccessibleMethod(method) == false)
- {
- return null;
- }
-
var proxyable = AcceptMethod(method, true, hook);
if (!proxyable && !method.IsAbstract)
{
diff --git a/src/Castle.Core/DynamicProxy/Contributors/InterfaceMembersOnClassCollector.cs b/src/Castle.Core/DynamicProxy/Contributors/InterfaceMembersOnClassCollector.cs
index 3e643cf802..27e50c0984 100644
--- a/src/Castle.Core/DynamicProxy/Contributors/InterfaceMembersOnClassCollector.cs
+++ b/src/Castle.Core/DynamicProxy/Contributors/InterfaceMembersOnClassCollector.cs
@@ -32,11 +32,6 @@ public InterfaceMembersOnClassCollector(Type type, bool onlyProxyVirtual, Interf
protected override MetaMethod GetMethodToGenerate(MethodInfo method, IProxyGenerationHook hook, bool isStandalone)
{
- if (ProxyUtil.IsAccessibleMethod(method) == false)
- {
- return null;
- }
-
if (onlyProxyVirtual && IsVirtuallyImplementedInterfaceMethod(method))
{
return null;
diff --git a/src/Castle.Core/DynamicProxy/Contributors/MembersCollector.cs b/src/Castle.Core/DynamicProxy/Contributors/MembersCollector.cs
index 332b25decf..4e5b1514fe 100644
--- a/src/Castle.Core/DynamicProxy/Contributors/MembersCollector.cs
+++ b/src/Castle.Core/DynamicProxy/Contributors/MembersCollector.cs
@@ -143,6 +143,11 @@ MetaMethod AddMethod(MethodInfo method, bool isStandalone)
return null;
}
+ if (ProxyUtil.IsAccessibleMethod(method) == false)
+ {
+ return null;
+ }
+
var methodToGenerate = GetMethodToGenerate(method, hook, isStandalone);
if (methodToGenerate != null)
{
@@ -173,10 +178,7 @@ protected bool AcceptMethod(MethodInfo method, bool onlyVirtuals, IProxyGenerati
///
protected bool AcceptMethodPreScreen(MethodInfo method, bool onlyVirtuals, IProxyGenerationHook hook)
{
- if (IsInternalAndNotVisibleToDynamicProxy(method))
- {
- return false;
- }
+ // NOTE: at this point, the method's accessibility should already have been checked (see `AddMethod` above)
var isOverridable = method.IsVirtual && !method.IsFinal;
if (onlyVirtuals && !isOverridable)
@@ -200,12 +202,6 @@ protected bool AcceptMethodPreScreen(MethodInfo method, bool onlyVirtuals, IProx
return false;
}
- //can only proxy methods that are public or protected (or internals that have already been checked above)
- if ((method.IsPublic || method.IsFamily || method.IsAssembly || method.IsFamilyOrAssembly || method.IsFamilyAndAssembly) == false)
- {
- return false;
- }
-
if (method.DeclaringType == typeof(MarshalByRefObject))
{
return false;
@@ -218,11 +214,5 @@ protected bool AcceptMethodPreScreen(MethodInfo method, bool onlyVirtuals, IProx
return true;
}
-
- private static bool IsInternalAndNotVisibleToDynamicProxy(MethodInfo method)
- {
- return ProxyUtil.IsInternal(method) &&
- ProxyUtil.AreInternalsVisibleToDynamicProxy(method.DeclaringType.Assembly) == false;
- }
}
}
\ No newline at end of file
diff --git a/src/Castle.Core/DynamicProxy/Contributors/WrappedClassMembersCollector.cs b/src/Castle.Core/DynamicProxy/Contributors/WrappedClassMembersCollector.cs
index eca221461b..0b228a9480 100644
--- a/src/Castle.Core/DynamicProxy/Contributors/WrappedClassMembersCollector.cs
+++ b/src/Castle.Core/DynamicProxy/Contributors/WrappedClassMembersCollector.cs
@@ -37,11 +37,6 @@ public override void CollectMembersToProxy(IProxyGenerationHook hook, IMembersCo
protected override MetaMethod GetMethodToGenerate(MethodInfo method, IProxyGenerationHook hook, bool isStandalone)
{
- if (ProxyUtil.IsAccessibleMethod(method) == false)
- {
- return null;
- }
-
var interceptable = AcceptMethodPreScreen(method, true, hook);
if (!interceptable)
{
diff --git a/src/Castle.Core/DynamicProxy/ProxyUtil.cs b/src/Castle.Core/DynamicProxy/ProxyUtil.cs
index cf94e773b5..780f7ca019 100644
--- a/src/Castle.Core/DynamicProxy/ProxyUtil.cs
+++ b/src/Castle.Core/DynamicProxy/ProxyUtil.cs
@@ -194,17 +194,20 @@ internal static bool IsAccessibleType(Type target)
/// true if the method is accessible to DynamicProxy, false otherwise.
internal static bool IsAccessibleMethod(MethodBase method)
{
- if (method.IsPublic || method.IsFamily || method.IsFamilyOrAssembly)
+ switch (method.Attributes & MethodAttributes.MemberAccessMask)
{
- return true;
- }
+ case MethodAttributes.Assembly:
+ case MethodAttributes.FamANDAssem:
+ return AreInternalsVisibleToDynamicProxy(method.DeclaringType.Assembly);
- if (method.IsAssembly || method.IsFamilyAndAssembly)
- {
- return AreInternalsVisibleToDynamicProxy(method.DeclaringType.Assembly);
- }
+ case MethodAttributes.Family:
+ case MethodAttributes.FamORAssem:
+ case MethodAttributes.Public:
+ return true;
- return false;
+ default: // `MethodAttributes.Private` or `MethodAttributes.PrivateScope`
+ return false;
+ }
}
///