我的问题是这个A有一个API控制器并且创建一个单一方法删除来自X DbSet属性的数据但是没有相同的Generic参数。我的结果是以某种方式将System.Type传递给Generic paramether。我的问题是一些方法吗?
var table = TableInfo.GetValue(_context) as DbSet<[here i need pass it]>;
我需要做一些事情(我知道这不行)
var table = TableInfo.GetValue(_context) as DbSet<TableInfo.GetType>;
我的完整代码
[HttpDelete("{name}/{id}")]
[Route("api/Delete")]
public IActionResult Delete(string name = "Items", int id = 2)
{
PropertyInfo TableInfo = GetValueByName(name);
if (TableInfo == null)
return NotFound("Haaaah");
var table = TableInfo.GetValue(_context) as DbSet<[here i need pass it]>;
if (table == null)
return BadRequest();
var prop = table.SingleOrDefault(p => p.Id == id);
if (prop == null)
return NotFound(prop);
table.Remove(prop);
_context.SaveChanges();
return Ok();
}
public PropertyInfo GetValueByName(string name)
{
Type t = _context.GetType();
List<PropertyInfo> list = new List<PropertyInfo>(t.GetProperties());
foreach(PropertyInfo m in list)
{
if (m.Name == name)
return m;
}
return null;
}
最后抱歉我的英语。 并感谢所有答案:)
答案 0 :(得分:0)
var table = TableInfo.GetValue(_context) as DbSet<[here i need pass it]>;
你不能这样做,你没有关于你需要什么类型的编译时间信息,你希望在代码运行之前如何利用?
如果你真的想要table
的编译时类型信息,你要么在编译时知道泛型类型,要么考虑到你的方法必须处理的所有潜在泛型类型,覆盖所有可能的执行路径(可怕的,不要这样做。)
使用界面也不起作用。一个假设的IIdEntity
和一行table as DbSet<IIdEntity>
将永远不会起作用,因为:
DbSet
不是接口。即使您使用IDbSet<TEntity>
,此接口在TEntity
中也是不变,因此以下内容始终会失败:
class User: IIdEntity { ... }
object o = someDbEntityOfUser;
var db = o as IDbSet<IIdEntity> //will always be null.
您当前设置的最佳选择是:
Id
属性。dynamic
并让运行时解析Id
来电。