Получение базового типа прокси-объекта
Я использую Castle DynamicProxy, и мои ViewModels являются прокси, что-то вроде этого:
пространство имен MyApplication.ViewModels { открытый класс MyViewModel: BaseViewModel, IMyViewModel { } }
прокси моей модели выглядит так:
{Name = "IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98" FullName = "IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98"}
Я хочу получить фактический тип или пространство имен фактического типа, который проксируется. Есть какой-либо способ сделать это? Я хочу что-то, что возвращает тип MyApplication.ViewModels.MyViewModel. Если я использую класс concreate в качестве прокси, BaseType возвращает фактический класс, который проксируется, но при использовании интерфейса BaseType возвращает System.Object.
2 ответа
Кажется, вы можете сделать следующее, чтобы получить фактический тип:
(прокси как IProxyTargetAccessor).DynProxyGetTarget().GetType()
Если вы используете прокси-класс, а не интерфейс, вы можете получить базовый тип, например:
var unproxiedType = ProxyUtil.GetUnproxiedType(proxy);
Если у вас нет доступа к ProxyUtil, это также будет работать:
private static Type GetUnproxiedType(object source)
{
var proxy = (source as IProxyTargetAccessor);
if (proxy == null)
return source.GetType();
return proxy.GetType().BaseType;
}