В этой строке:
var generic = method.MakeGenericMethod(type);
Вы создаете универсальный метод типа type
, который MyRequest
.
Итак, в конечном итоге вы используете MyRequest
как TResponse
.
Но на самом деле вы хотите передать MyResponse
как TResponse
.
Вы можете сделать следующее для вызова этого динамического вызова:
- получить интерфейс
IMyRequest<>
, который реализует ваш запрос - получитьединственный общий аргумент этого интерфейса, который будет
TResponse
Вот как может выглядеть код, но вам нужно добавить некоторые проверки типов и корректную обработку ошибок здесь:
var type = request.GetType();
var responseType = type.GetInterfaces() // [IRequest<MyResponse>]
.Single(i => i.GetGenericTypeDefinition() == typeof(IRequest<>)) // IRequest<MyResponse>
.GetGenericArguments() // [MyResponse]
.Single(); // MyResponse
var method = mediator.GetType().GetMethod("Send");
var generic = method.MakeGenericMethod(responseType); // note that responseType is used here
var response = generic.Invoke(mediator, new object[] { request });
В конце концов, уверены ли вы, что хотите связать свой ответ с конкретным определением запроса?Я не знаю вашу архитектуру и то, что вы пытаетесь достичь, но, возможно, это может быть более гибкое решение:
public interface IRequest
{
}
public interface IMediator
{
TResponse Send<TRequest, TResponse>(IRequest request);
}
public class MyRequest : IRequest
{
}
public class MyResponse
{
}
public class Mediator : IMediator
{
public TResponse Send<TRequest, TResponse>(IRequest request)
{
Console.WriteLine("Processing...");
return default(TResponse);
}
}