繁体   English   中英

子类问题的通用方法约束

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM