Overwiew
(问题在最后)
在我的应用程序中,我有以下类和接口(简化):
class RequestingUserData
interface IQuery<TResult>
interface IQueryWithUser<TResult> : IQuery<TResult>
class UserSearchQuery : IQueryWithUser<RequestingUserData>
interface IQueryHandler<in TQuery, TResult> where TQuery : IQuery<TResult>
{
TResult Handle(TQuery);
}
interface IUserSearchQueryHandler : IQueryHandler<UserSearchQuery, RequestingUserData>
class UserSearchQueryHandler : IUserSearchQueryHandler
我想将UserSearchQueryHandler
投射到它的最高位置&#34;接口 - IQueryHandler
就像这样:
(IQueryHandler<IQueryWithUser<RequestingUserData>,RequestingUserData>)new UserSearchQueryHandler();
但这会导致运行时转换异常。
问题
var assignable = typeof(IQueryHandler<IQueryWithUser<RequestingUserData>,RequestingUserData>)
.IsAssignableFrom(typeof(UserSearchQueryHandler))`
返回false。
然而,当我这样做时:
typeof(IQueryHandler<UserSearchQuery,RequestingUserData>)
.IsAssignableFrom(typeof(UserSearchQueryHandler))
显然是真的。
我尝试了什么
我试图重新安排我的定义:
interface IUserSearchQueryHandler<T> : IQueryHandler<T, RequestingUserData> where T : IQueryWithUser<RequestingUserData>
class UserSearchQueryHandler : IUserSearchQueryHandler<UserSearchQuery>
但它没有帮助。
问题
是否有可能将UserSearchQueryHandler
的对象转换/转换为IQueryHandler<IQueryWithUser<RequestingUserData>,RequestingUserData>
?
修改
这实际上是我打算用我的演员(简化):
public async Task<K> Dispatch<K>(IQueryWithUser<K> query)
{
return await DoDispatchWithUser<IQueryWithUser<K>, K>(query);
}
// below T will be IQueryWithUser<K>
private async Task<K> DoDispatchWithUser<T, K>(T query) where T : class, IQueryWithUser<K>
{
var handler = ResolveHandler(query) as IQueryHandler<T, K>; // Becomes null
return await DispatchCommand(handler, query);
}
private async Task<K> DispatchCommand<T, K>(IQueryHandler<T, K> handler, T query) where T : class, IQuery<K>
{
return await handler.Handle(query);
}
private object ResolveHandler<TResult>(IQuery<TResult> query)
{
var handler = typeof(IQueryHandler<,>).MakeGenericType(query.GetType(), typeof(TResult));
var service = _serviceProvider.GetService(handler); // this returns UserSearchQueryHandler object
return service;
}