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

时间:2014-05-11 14:04:01

标签: c# generics interface

我有一个有一些方法的类,其中两个(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.

有关如何处理此事的任何线索?

2 个答案:

答案 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;