Допустим, у меня есть общий интерфейс 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 , Как я могу открыть ошибку?