Я использую Castle DynamicProxy, и мои ViewModels являются прокси, примерно так:
namespace MyApplication.ViewModels { public class MyViewModel : BaseViewModel, IMyViewModel { } }
Прокси моей модели просмотра выглядит так:
{Name = "IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98" FullName = "IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98"}
Я хочу получить фактический тип или пространство имен фактического проксируемого типа. Есть какой-либо способ сделать это? Я хочу что-то, что возвращает тип MyApplication.ViewModels.MyViewModel. Если я использую конкретный класс в качестве прокси, BaseType возвращает фактический класс, для которого выполняется проксирование, но при использовании интерфейса BaseType вернет System.Object.
2 ответа
Кажется, вы можете сделать следующее, чтобы получить фактический тип:
(proxy As IProxyTargetAccessor).DynProxyGetTarget().GetType()
Если вы проксируете класс, а не интерфейс, вы можете получить базовый тип следующим образом:
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;
}
ProxyUtil
может оказаться полезным в самой DP, поэтому я перенесу его из Windsor в DynamicProxy для следующей версии.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.