2009-09-12 11 views
10

używam Castle DynamicProxy i moi ViewModels są proxy, coś takiego:Uzyskanie podstawowej typ obiektu proxy

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

proxy mojego viewmodel wygląda tak jakby:

{Nazwa = „IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98” FullName = „IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98”}

Chcę uzyskać rzeczywisty typ lub nazw rzeczywistego typu, który jest zastępowanym. Czy jest jakiś sposób to zrobić? Chcę coś, co zwraca typ MyApplication.ViewModels.MyViewModel. Jeśli używam klasy konkreacji jako proxy, BaseType zwraca rzeczywistą klasę, która jest proxied, ale przy użyciu interfejsu, BaseType zwróci System.Object.

Odpowiedz

15

Wydaje można wykonać następujące czynności, aby uzyskać rzeczywisty typ:

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

Tak, to jest droga. Zauważ jednak, że DynProxyGetTarget() może zwracać wartość null, jeśli proxy nie ma celu. –

5

Jeśli buforowania klasy a nie interfejsu, można uzyskać pod spodem typ takiego:

var unproxiedType = ProxyUtil.GetUnproxiedType(proxy); 

Jeśli nie masz dostępu do ProxyUtil, będzie to również działać:

private static Type GetUnproxiedType(object source) 
{ 
    var proxy = (source as IProxyTargetAccessor); 

    if (proxy == null) 
    return source.GetType(); 

    return proxy.GetType().BaseType;    
} 
+0

Tak, jednak ta klasa jest częścią Windsor a nie DynamicProxy, więc nie zawsze jest dostępna –

+0

Krzysztof zasugerował, że pierwsze rozwiązanie nie będzie działać dla użytkowników, którzy nie używają Castle Windsor, więc zmodyfikowałem odpowiedź. –

+2

BTW Myślę, że 'ProxyUtil' może być użyteczną rzeczą w samym DP, więc przeniesię ją z Windsor do DynamicProxy dla następnej wersji. –

Powiązane problemy