我有一个有一些方法的类,其中两个(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.
有关如何处理此事的任何线索?
答案 0 :(得分:2)
嗯,这个错误非常明显。实现接口时,必须完全按照定义实现其所有成员。 由于您已在实现中引入了接口中不存在的其他通用约束,因此实现与接口不匹配。
有两种方法可以解决此问题:将约束添加到接口,或从实现中删除它们。
作为旁注,您可能需要考虑使整个界面具有通用性,即将其声明为:
// 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);
}
答案 1 :(得分:1)
在您的实施中,您可以这样做:
public void Add<T>(T entity) where T : DbSet
{ … }
虽然你的界面指定了这个:
void Add<T>(T entity);
因此,基本上,您需要使双方的约束(where
部分)相同。在您的情况下,因为您需要DbSet
constaint来实现,您应该将它添加到接口:
void Add<T>(T entity) where T : DbSet;