使用接口时使用通用方法

时间:2017-12-06 19:59:23

标签: c# entity-framework generics

我陷入了仿制药问题。 我有一个方法,根据对象类型从DbContext对象返回DbSet。

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

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

现有方法

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

新方法(这正是我尝试做的事情

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 个答案:

答案 0 :(得分: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);

答案 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();
}