获取代理对象的基础类型

17

我正在使用Castle DynamicProxy,我的ViewModel是一个代理对象,例如:

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

我的ViewModel的代理对象看起来是这样的:

{Name = "IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98" FullName = "IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98"}

我想获取被代理的实际类型或命名空间。有没有办法做到这一点?我想要返回MyApplication.ViewModels.MyViewModel类型的东西。如果我使用具体类作为代理,BaseType将返回被代理的实际类,但是当使用接口时,BaseType会返回System.Object。

2个回答

20

看起来你可以通过以下方式获取实际类型:

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

1
是的,那就是正确的方法。不过请注意,如果代理没有目标,DynProxyGetTarget() 可能会返回 null。 - Krzysztof Kozmic
谢谢您,@hadi-eskandari Scorpions先生 :) - Mertez
1
@Mertez 哈哈,莫瑞,你太客气了 :) - Hadi Eskandari

15

如果您要代理一个类而不是接口,可以像这样获取基础类型:

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

是的,但这个类是 Windsor 的一部分,而不是 DynamicProxy,因此它并不总是可用。 - Krzysztof Kozmic
Krzysztof建议第一种解决方案对于不使用Castle Windsor的用户无效,因此我修改了答案。 - Gregor Slavec
2
顺便说一句,我认为ProxyUtil在DP本身中可能是一个有用的东西,所以我会将它从Windsor移植到DynamicProxy以供下一个版本使用。 - Krzysztof Kozmic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接