类中没有泛型引用的泛型类型方法
本文关键字:泛型类型 方法 引用 泛型 | 更新日期: 2023-09-27 18:02:50
我有一个类,有一些方法,其中两个(ADD和UPDATE)想要通用。
这是我的班级:
public class CatalogRepository : ICatalogRepository
{
public CatalogRepository(DbContext dbContext)
{
if (dbContext == null)
throw new ArgumentNullException("dbContext");
DbContext = dbContext;
}
private DbContext DbContext { get; set; }
#region Generic ADD and UPDATE
public void Add<T>(T entity) where T : DbSet
{
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
if (dbEntityEntry.State != System.Data.Entity.EntityState.Detached)
{
dbEntityEntry.State = System.Data.Entity.EntityState.Added;
}
else
{
DbContext.Set<T>().Add(entity);
}
}
public void Update<T>(T entity) where T : DbSet
{
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
if (dbEntityEntry.State == System.Data.Entity.EntityState.Detached)
{
DbContext.Set<T>().Attach(entity);
}
dbEntityEntry.State = System.Data.Entity.EntityState.Modified;
}
#endregion
#region SetupSensor
public IEnumerable<SetupSensor> GetSetupSensors(string masterEntity)
{
return DbContext.Set<SetupSensor>().Where(c => c.MasterEntity == masterEntity).ToList();
}
public IEnumerable<SetupSensor> ReadOnlySetupSensors(string masterEntity)
{
return DbContext.Set<SetupSensor>().AsNoTracking().Where(c => c.MasterEntity == masterEntity).ToList();
}
public SetupSensor GetSetupSensor(int sensorId)
{
return DbContext.Set<SetupSensor>().Where(c => c.SensorId == sensorId).FirstOrDefault();
}
#endregion
}
接口实现:
public interface ICatalogRepository
{
SetupSensor GetSetupSensor(int sensorId);
IEnumerable<SetupSensor> GetSetupSensors(string masterEntity);
void Add<T>(T entity);
void Update<T>(T entity);
}
当我构建时,我在两个通用方法上得到以下错误:
The constraints for type parameter 'T' of method 'CatalogRepository.Add<T>(T)' must match the constraints for type parameter 'T' of interface method 'ICatalogRepository.Add<T>(T)'. Consider using an explicit interface implementation instead.
有关于如何处理这个的线索吗?
这个错误是不言自明的。在实现接口时,必须完全按照定义的方式实现其所有成员。由于您在实现中引入了接口中没有的额外泛型约束,因此实现与接口不匹配。
有两种方法可以解决这个问题:要么向接口添加约束,要么从实现中删除约束。 作为旁注,您可能想要考虑使整个接口泛型,即像这样声明它:// you may or may not want to have the constraint here
public interface ICatalogRepository<T> where T : DbSet
{
// sensor methods
void Add(T entity);
void Update(T entity);
}
在你的实现中你这样做:
public void Add<T>(T entity) where T : DbSet
{ … }
当你的接口指定这个时:
void Add<T>(T entity);
因此,本质上,您需要使两边的约束(where
部分)相同。在您的示例中,由于需要实现DbSet
约束,您应该将其添加到接口:
void Add<T>(T entity) where T : DbSet;