我有以下界面:

public interface Query<TModel>
{
    IList<TModel> GetData();
}


我想要一些可以返回所有查询实现的服务:

public interface IQueryProvider
{
   List<Query<>> GetAllQueries();
}


然后就可以调用GetData之一:

var queries = provider.GetAllQueries();
var results = queries[0].GetData();


使用泛型能否实现这一目标?

最佳答案

除了Query<>内,不能使用开放的通用类型typeof()。如果要引用一组查询(未指定类型),则需要一个非通用的API,例如:

public interface IQuery {
     IList GetData();
     Type QueryType { get; }
}
public interface IQuery<TModel> : IQuery
{
    new IList<TModel> GetData();
}
public interface IQueryProvider
{
   List<IQuery> GetAllQueries();
}


但是,这意味着您需要为每一个提供IQuery的影子实现,这很麻烦。请注意,如果任何服务同时实现了IQuery<Foo>IQuery<Bar>,则在上面也存在歧义-因为没有明显的方式表示QueryType

08-06 12:45