首页 文章

使用接口时使用通用方法

提问于
浏览
0

我坚持一个泛型问题 . 我有一个方法,根据对象类型从DbContext对象返回DbSet .

现在我想编写I方法,其中传入一个实现名为IBaseData的接口的对象(所有实体都实现) . 我想使用现有的方法根据IBaseData对象的类型返回正确的DbSet,但我无法让它工作 .

我尝试过各种版本的typeof和gettype .

Existing method

public GenericRepository<T> GetRepo<T>() where T : class
{
    return new GenericRepository<T>(_context);
}

New method (this is just what Im trying to do)

public async Task SetDateLastInvoked<T>(IBaseData data, int id)
{
    var tmp = GetRepo<typeof(data)>().Where(obj => obj.Id.Equals(id));
    tmp.DateLastInvoked = DateTime.Now;

    await SaveChangesAsync();
}

2 回答

  • 1

    我假设你做的事情如下:

    public interface IBaseData 
    {
      int Id { get; set; }
    }
    

    然后一个方法会像

    public GenericRepository<T> GetRepo<T>() 
      where T : class
    {
      return new GenericRepository<T>(_context);
    }
    
    public async Task SetDateLastInvoked<T>(int id)
      where T : class, IBaseData
    {
      var tmp = GetRepo<T>().FirstOrDefault(obj => obj.Id == id));
      tmp.DateLastInvoked = DateTime.Now;
    
      await SaveChangesAsync();
    }
    

    用法:

    public MyClass : IBaseData 
    { 
      public Id { get; set }
    }
    
    SetDateLastInvoked<MyClass>(1);
    
  • 0

    基于之前的回答,结束了这一点:

    public async Task SetLastInvoked<T>(int id) where T : class, IBaseData
    {
        var tmp = await GetRepo<T>().Single(obj => obj.Id.Equals(id));
        tmp.DateLastInvoked = DateTime.Now;
    
        await SaveChangesAsync();
    }
    

    我还创建了另一种基于相同模式的方法:

    public async Task DeleteItem<T>(int id, bool removeRow) where T : class, IBaseData
    {
        if (removeRow)
        {
            GetRepo<T>().Delete(await GetRepo<T>().Single(obj => obj.Id.Equals(id)));
        }
        else
        {
            var tmp = await GetRepo<T>().Single(obj => obj.Id.Equals(id));
            tmp.Active = false;
        }
    
        await SaveChangesAsync();
    }
    

相关问题