ProxyUtil
using Castle.DynamicProxy.Internal;
using System;
using System.Reflection;
using System.Runtime.Remoting;
namespace Castle.DynamicProxy
{
public class ProxyUtil
{
public static object GetUnproxiedInstance(object instance)
{
if (!RemotingServices.IsTransparentProxy(instance)) {
IProxyTargetAccessor proxyTargetAccessor = instance as IProxyTargetAccessor;
if (proxyTargetAccessor != null)
instance = proxyTargetAccessor.DynProxyGetTarget();
}
return instance;
}
public static Type GetUnproxiedType(object instance)
{
if (!RemotingServices.IsTransparentProxy(instance)) {
IProxyTargetAccessor proxyTargetAccessor = instance as IProxyTargetAccessor;
if (proxyTargetAccessor != null) {
object obj = proxyTargetAccessor.DynProxyGetTarget();
if (obj != null) {
if (obj == instance)
return instance.GetType().GetTypeInfo().BaseType;
instance = obj;
}
}
}
return instance.GetType();
}
public static bool IsProxy(object instance)
{
if (RemotingServices.IsTransparentProxy(instance))
return true;
return instance is IProxyTargetAccessor;
}
public static bool IsProxyType(Type type)
{
return typeof(IProxyTargetAccessor).IsAssignableFrom(type);
}
public static bool IsAccessible(MethodBase method)
{
return method.IsAccessible();
}
public static bool IsAccessible(MethodBase method, out string message)
{
if (method.IsAccessible()) {
message = null;
return true;
}
message = CreateMessageForInaccessibleMethod(method);
return false;
}
private static string CreateMessageForInaccessibleMethod(MethodBase inaccessibleMethod)
{
Assembly assembly = inaccessibleMethod.DeclaringType.GetTypeInfo().Assembly;
string str = $"""{inaccessibleMethod}""";
string str2 = InternalsUtil.CreateInstructionsToMakeVisible(assembly);
return str + str2;
}
}
}