TargetException в RealProxy Invoke Сообщение для вызова универсального типа в группе методов - PullRequest
0 голосов
/ 10 октября 2018

Допустим, у меня есть общий интерфейс IService<T> и класс, реализующий его Service : IService<Bar> Я создаю прокси этого интерфейса:

var proxy = new DynamicProxy<IService<Bar>>(new Service()).GetTransparentProxy() as IService<Bar>;

DynamicProxy - это простая реализация RealProxy:

    public class DynamicProxy<I> : RealProxy
    {
        private I _decorated;

        public DynamicProxy(I decorated) : base(typeof(I))
        {
            this._decorated = decorated;
        }

        public override IMessage Invoke(IMessage msg)
        {
            IMethodCallMessage methodCall = (IMethodCallMessage)msg;
            MethodInfo methodInfo = methodCall.MethodBase as MethodInfo;

            return new ReturnMessage(
                methodInfo.Invoke(this._decorated, methodCall.InArgs),
                null,
                0,
                methodCall.LogicalCallContext,
                methodCall);
        }
    }

При непосредственном использовании моего прокси-сервера он работает нормально:

IEnumerable<Bar> bars = new List<Bar>() { new Bar { id = 2 }, new Bar { id = 3 } };
proxy.Foo(bars.First());

или даже с лямбдой, это нормально:

 var data = bars.ToList().Select(bar => proxy.Foo(bar)).ToList();

Но при использовании с группой методов этогенерирует целевое исключение

var data = bars.ToList().Select(proxy.Foo).ToList();

Брошенное исключение:

{System.Reflection.TargetException: Object does not match target type.
   at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)
   at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)

Кажется, что realproxy не удалось получить правильный тип универсального:

База метода для IMethodCallMessage равна {Int32 Foo(System.__Canon)} вместо {Int32 Foo(Bar)}

Это ограничение группы методов?или ошибка в реализации RealProxy?

Вы можете увидеть это здесь: https://dotnetfiddle.net/w2VlVN

Не повезло на форуме MSDN , Как я могу открыть ошибку?

1 Ответ

0 голосов
/ 04 ноября 2018

Проблема здесь:

methodInfo.Invoke(this._decorated, methodCall.InArgs), 

Аргумент this здесь неверен, вам нужно вызывать ваш класс напрямую, а не с помощью this.

Попробуйте передать _decorated напрямую, без использования this.

...