繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM