类不能从接口分配

时间:2017-11-30 11:29:30

标签: c#

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;
}

0 个答案:

没有答案