2009-09-12 17 views
10

estoy usando Castillo DynamicProxy y mis ViewModels son un proxy, algo como esto:Conseguir tipo subyacente de un objeto proxy

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

un proxy de mi modelo de vista se parece a esto, sin embargo:

{Nombre = "IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98" FullName = "IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98"}

Quiero obtener el tipo real o espacio de nombres del tipo real que se aproxima. ¿Hay alguna manera de hacer esto? Quiero algo que devuelva el tipo MyApplication.ViewModels.MyViewModel. Si estoy utilizando la clase de concreate como proxies, BaseType devuelve la clase real que se está proxys, pero cuando se utiliza la interfaz, BaseType devolvería System.Object.

Respuesta

15

parece que se puede hacer lo siguiente para obtener el tipo real:

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

Sí, ese es el camino a seguir. Sin embargo, tenga en cuenta que DynProxyGetTarget() puede devolver nulo, si el proxy no tiene objetivo. –

5

Si estamos pasando una clase y no una interfaz, se puede obtener el tipo subyacente de esta manera:

var unproxiedType = ProxyUtil.GetUnproxiedType(proxy); 

Si usted no tiene acceso a ProxyUtil esto también funciona:

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

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

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

Sí, sin embargo, esta clase es parte de Windsor no DynamicProxy, por lo que no siempre está disponible –

+0

Krzysztof sugirió que la primera solución no funcionaría para los usuarios que no usan Castle Windsor, por lo que modifiqué la respuesta. –

+2

BTW Creo que 'ProxyUtil' podría ser una herramienta útil en DP, así que lo transferiré de Windsor a DynamicProxy para la próxima versión. –

Cuestiones relacionadas