代码之家  ›  专栏  ›  技术社区  ›  oleveau

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

  •  8
  • oleveau  · 技术社区  · 6 年前

    假设我有一个通用接口 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());
    

    或者即使有一个lambda,也没关系:

     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的MethodBase是 {Int32 Foo(System.__Canon)} 而不是 {Int32 Foo(Bar)}

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

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

    一点运气都没有 MSDN forum ,我怎样才能打开一个bug?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Barr J    6 年前

    问题是:

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

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

    试着传球 _decorated 直接不使用 .