我遇到了一个关于创建我们查询类的通用列表的问题。这些查询类都是从基础抽象泛型类派生出来的,并且具有自引用类型约束。
简化后的基础类和派生类如下:
public abstract class AbstractQuery<TQuery, TResult>
where TQuery : AbstractQuery<TQuery, TResult>
{
public IEnumerable<TResult> Query ()
{
return new List<TResult>();
}
}
public class FirstQuery : AbstractQuery<FirstQuery, object> { }
public class SecondQuery : AbstractQuery<SecondQuery, object> { }
应用程序代码想要创建这些查询的列表,并对每个执行Query方法,例如:
var queryList = new List<AbstractQuery<AbstractQuery, object>>
{
new FirstQuery(),
new SecondQuery()
};
foreach ( var query in queryList )
{
query.Query();
}
由于List类型无效,因此此部分无法构建。那么我的问题是,我可以使用什么类型的List来使此代码正确运行?
顺便说一句,我们通过添加一个具有Query方法签名的IQuery接口,并由AbstractQuery实现来解决了这个问题,但仍然希望看到最初的方式是否可行。是的,实际代码中存在自引用约束的原因 - 它需要一些反射代码。