假设我有一个通用接口IService<T>和一个实现它的类,我创建了该接口的代理:
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?
发布于 2018-11-04 15:04:08
问题在这里:
methodInfo.Invoke(this._decorated, methodCall.InArgs), 这里的this参数是错误的,您需要直接调用您的类,而不是使用this。
尝试在不使用this的情况下直接传递_decorated。
https://stackoverflow.com/questions/52734894
复制相似问题