我陷入了仿制药问题。 我有一个方法,根据对象类型从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();
}
答案 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();
}