2009-09-12 26 views
10

我使用的是城堡DynamicProxy和我的ViewModels是一個代理,像這樣:獲取代理對象的基本類型

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

我的視圖模型的代理看起來是這樣,但:

{名稱=「IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98」全名=「IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98」}

我想是被代理的實際類型的實際類型或命名空間。有沒有辦法做到這一點?我想要返回MyApplication.ViewModels.MyViewModel類型的東西。如果我使用concreate類作爲代理,BaseType返回被代理的實際類,但是在使用接口時,BaseType將返回System.Object。

回答

15

看來你可以做以下,以獲得實際類型:

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

是的,這是要走的路。但請注意,如果代理沒有目標,DynProxyGetTarget()可以返回null。 – 2009-09-18 12:43:48

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的一部分而不是DynamicProxy,因此並不總是可用 – 2011-05-13 09:27:11

+0

Krzysztof建議第一種解決方案對於不使用Castle Windsor的用戶不適用,因此我修改了答案。 – 2011-05-13 13:12:23

+2

順便說一下,我認爲'ProxyUtil'可能是DP本身的一個有用的東西,所以我將它從Windsor移植到下一個版本的DynamicProxy。 – 2011-05-13 21:18:43