类中没有泛型引用的泛型类型方法

本文关键字:泛型类型 方法 引用 泛型 | 更新日期: 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;