[英]Generic method in C# containing reference to member of generic type (class)
[英]Generic Type Method Without Generic Reference in Class
我有一个包含一些方法的类,其中两个(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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.