RealProxy中的TargetException调用方法组中泛型类型调用的消息

ole*_*eau 8 c# generics reflection proxy remoting

假设我有一个通用接口 IService<T>和一个实现它的类Service : IService<Bar> 我创建了该接口的代理:

var proxy = new DynamicProxy<IService<Bar>>(new Service()).GetTransparentProxy() as IService<Bar>;
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

直接使用我的代理时它工作正常:

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

或者甚至用lambda,它没关系:

 var data = bars.ToList().Select(bar => proxy.Foo(bar)).ToList();
Run Code Online (Sandbox Code Playgroud)

但是当与方法组一起使用时,它会抛出目标异常

var data = bars.ToList().Select(proxy.Foo).ToList();
Run Code Online (Sandbox Code Playgroud)

引发的异常:

{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)
Run Code Online (Sandbox Code Playgroud)

似乎realproxy无法获得正确类型的泛型:

{Int32 Foo(System.__Canon)}而不是IMethodCallMessage的MethodBase{Int32 Foo(Bar)}

这是方法组的限制吗?或RealProxy实现中的错误?

你可以在这里看到它:https: //dotnetfiddle.net/w2VlVN

MSDN论坛上没有运气,我怎么能打开一个bug?

Bar*_*r J 0

问题在这里:

methodInfo.Invoke(this._decorated, methodCall.InArgs), 
Run Code Online (Sandbox Code Playgroud)

这里的论点this是错误的,您需要直接调用您的类,而不是使用this.

尝试_decorated直接通过而不使用this.