Я использую Castle DynamicProxy, и мои ViewModels являются прокси, примерно так:

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

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

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

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

15
Hadi Eskandari 12 Сен 2009 в 21:34

2 ответа

Лучший ответ

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

(proxy As IProxyTargetAccessor).DynProxyGetTarget().GetType()
18
Hadi Eskandari 14 Сен 2009 в 14:44
1
Да, это правильный путь. Однако обратите внимание, что DynProxyGetTarget () может возвращать значение null, если прокси-сервер не имеет цели.
 – 
Krzysztof Kozmic
18 Сен 2009 в 16:43

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

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;            
}
11
Gregor Slavec 13 Май 2011 в 17:12
Да, однако этот класс является частью Windsor, а не DynamicProxy, поэтому он не всегда доступен
 – 
Krzysztof Kozmic
13 Май 2011 в 13:27
Кшиштоф предположил, что первое решение не будет работать для пользователей, которые не используют Castle Windsor, поэтому я изменил ответ.
 – 
Gregor Slavec
13 Май 2011 в 17:12
2
Кстати, я думаю, что ProxyUtil может оказаться полезным в самой DP, поэтому я перенесу его из Windsor в DynamicProxy для следующей версии.
 – 
Krzysztof Kozmic
14 Май 2011 в 01:18