Получение базового типа прокси-объекта - PullRequest
13 голосов
/ 12 сентября 2009

Я использую Castle DynamicProxy, и мои ViewModels являются прокси, что-то вроде этого:

namespace MyApplication.ViewModels
{
   public class MyViewModel : BaseViewModel, IMyViewModel
   {
   }
}

прокси моей модели выглядит так:

{Name = "IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98" FullName = "IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98"}

Я хочу получить фактический тип или пространство имен фактического типа, который проксируется. Есть какой-либо способ сделать это? Я хочу что-то, что возвращает тип MyApplication.ViewModels.MyViewModel. Если я использую класс concreate в качестве прокси, BaseType возвращает фактический класс, который проксируется, но при использовании интерфейса BaseType возвращает System.Object.

Ответы [ 2 ]

16 голосов
/ 14 сентября 2009

Кажется, вы можете сделать следующее, чтобы получить фактический тип:

(proxy As IProxyTargetAccessor).DynProxyGetTarget().GetType()
7 голосов
/ 13 мая 2011

Если вы используете прокси-класс, а не интерфейс, вы можете получить базовый тип, например:

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;            
}
...