[英]Generic Method Constraint of child class issue
首先是类层次结构的分解:
public class Entity {
}
public abstract class AuditBase<T> {
protected abstract void SomeMethod();
}
public class EntityAudit : AuditBase<Entity> {
protected override void SomeMethod() {
}
}
然后,我有一个具有如下约束的方法:
public async Task<IEnumerable<T>> Query<T>(int id) where T : AuditBase<T>
{
var instance = Activator.CreateInstance<T>();
var refTable = instance.RefTable;
var collection = _context.Database.GetCollection<T>("Audit");
var filter = String.Join("{ RefTable: '", refTable, "', Object: { Id: {'$eq': ", id.ToString(), "} } }");
return await collection.FindSync<T>(filter).ToListAsync();
}
但是,当我使用以下代码时出现错误:
var result = await Query<EntityAudit>(5);
错误是:
The type 'EntityAudit' cannot be used as type parameter 'T' in the generic type of method 'Audit.Query<T>(int)'. There is no implicit reference conversion from 'EntityAudit' to 'AuditBase<EntityAudit>'.
我有点理解这个问题。 我的目标是将返回的IEnumerable
限制为仅包含AuditBase
子对象。 目前,由于T
,它正在尝试返回“实体”类型的项目。
我不能这样做约束: ... where T: Audit
as Audit
“需要一个参数”。
有什么想法吗? 如何实现约束?
所以我最终做了以下事情:
public async Task<IEnumerable<T>> Query<T,U>(int id) where T: AuditBase<U>
{
...
}
var result = await Query<EntityAudit, Entity>(5)
这有效。
但是,有没有更好的方法?
创建一个非通用审计基类
//...
public abstract class AuditBase {
//...
}
public abstract class AuditBase<T> : AuditBase {
protected abstract void SomeMethod();
}
//...
并将其用于约束
public async Task<IEnumerable<T>> Query<T>(int id) where T : AuditBase {
//...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.