2009-09-12 7 views
10

sto usando Castello DynamicProxy ei miei ViewModels sono un proxy, qualcosa di simile:Ottenere tipo sottostante di un oggetto proxy

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

un proxy del mio ViewModel assomiglia a questo, però:

{Nome = "IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98" FullName = "IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98"}

voglio ottenere il tipo reale o dello spazio dei nomi del tipo effettivo che viene inoltrata. C'è un modo per fare questo? Voglio qualcosa che restituisca il tipo MyApplication.ViewModels.MyViewModel. Se sto usando la classe concreata come proxy, BaseType restituisce la classe effettiva che viene sottoposta a proxy, ma quando si utilizza l'interfaccia, BaseType restituisce System.Object.

risposta

15

Sembra che si può fare quanto segue per ottenere il tipo effettivo:

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

Sì, questa è la strada da percorrere. Si noti tuttavia che DynProxyGetTarget() può restituire null, se il proxy non ha una destinazione. –

5

Se si Proxying una classe e non un'interfaccia, è possibile ottenere il tipo di fondo in questo modo:

var unproxiedType = ProxyUtil.GetUnproxiedType(proxy); 

Se non si ha accesso a ProxyUtil, funzionerà anche:

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

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

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

Sì, tuttavia questa classe fa parte di Windsor not DynamicProxy, quindi non è sempre disponibile –

+0

Krzysztof ha suggerito che la prima soluzione non funzionerà per gli utenti che non utilizzano Castle Windsor, quindi ho modificato la risposta. –

+2

BTW Penso che 'ProxyUtil' potrebbe essere una cosa utile in DP stesso quindi lo porterò da Windsor a DynamicProxy per la prossima versione. –