I have a generic interface:
public interface ICacheRequestHandler<in TRequest, TResponse>
{
Task<TResponse> HandleAsync(TRequest request, CancellationToken cancellationToken = default);
}
I would like to get Type variable of interface with given TRequest and TResponse to make it possible to request correct service implementing the mentioned interface in the DI. Something like this:
public async Task<TResponse> Handle(
TRequest request,
CancellationToken cancellationToken,
RequestHandlerDelegate<TResponse> next)
{
using var scope = serviceProvider.CreateScope();
var requestType = request.GetType();
var responseType = typeof(TResponse);
scope.ServiceProvider.GetService(typeof(ICacheRequestHandler<requestType, responseType>)) // How to get this working? :)
}
Thank you so much for any help in advance. Regards
CodePudding user response:
Use Type.MakeGenericType
like this:
var serviceType = typeof(ICacheRequestHandler<,>)
.MakeGenericType(requestType, responseType);
scope.ServiceProvider.GetService(serviceType);
This uses the open-generic Type
of ICacheRequestHandler
and applies the generic arguments at runtime.