2009-09-12 5 views
10

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

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

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

{Name = «IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98» FullName = «IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98»}

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

ответ

15

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

 
(proxy As IProxyTargetAccessor).DynProxyGetTarget().GetType() 
+1

Да, это путь. Обратите внимание, что DynProxyGetTarget() может возвращать значение null, если у прокси нет цели. –

5

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

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;    
} 
+0

Да, однако этот класс является частью Windsor not DynamicProxy, поэтому он не всегда доступен –

+0

Krzysztof предположил, что первое решение не будет работать для пользователей, которые не используют Castle Windsor, поэтому я изменил ответ. –

+2

BTW Я думаю, что 'ProxyUtil' может быть полезной вещью в самом DP, поэтому я перенес его из Windsor в DynamicProxy для следующей версии. –