我有以下界面:
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
。