C# 正在将System.Type传递给泛型类型
我的问题是,这有一个API控制器,并创建一个方法从X DbSet属性删除数据,但没有相同的通用参数。我的结果是以某种方式将System.Type传递给泛型参数。我的问题是如何做到这一点C# 正在将System.Type传递给泛型类型,c#,asp.net,generic-type-argument,system.type,C#,Asp.net,Generic Type Argument,System.type,我的问题是,这有一个API控制器,并创建一个方法从X DbSet属性删除数据,但没有相同的通用参数。我的结果是以某种方式将System.Type传递给泛型参数。我的问题是如何做到这一点 var table = TableInfo.GetValue(_context) as DbSet<[here i need pass it]>; 我需要做点什么,就像我知道这行不通一样 var table = TableInfo.GetValue(_context) as DbSe
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;
}
最后,我对我的英语感到抱歉。
感谢所有的回答:var table=TableInfo.GetValue\u作为DbSet的上下文
你不能这样做,你没有关于你需要什么类型的编译时信息,你希望如何在代码运行之前利用它
如果您确实想要表的编译时类型信息,您要么在编译时知道泛型类型,要么考虑到所有潜在的泛型类型,覆盖所有可能的执行路径,您的方法必须处理可怕的类型,不要这样做
使用接口也不起作用。假设的身份和作为DbSet的按行转换表将永远不起作用,因为:
类型差异只允许在接口和委托中使用,DbSet不是接口。
即使使用IDbSet,此接口的强度不变,因此以下操作将始终失败:
class User: IIdEntity { ... }
object o = someDbEntityOfUser;
var db = o as IDbSet<IIdEntity> //will always be null.
当前设置的最佳选项有:
继续使用反射;使用它检查实体的Id属性。
使用dynamic,让运行时简单地解析Id调用。
您希望如何从只有在运行时才知道的东西中获取静态类型信息?我看不出什么地方依赖于泛型类型,所以为什么需要将其转换为该类型?也许你可以在你的数据库集上实现一个接口,该接口公开你想要的属性,而不管T是什么,并将表转换为那样。我需要它,因为我需要获取id,如果我不转换它,我就无法获取id。我可以尝试动态,但它无法工作,因为我尝试的接口可能重复,但它总是返回null,因为这样。谢谢德克罗斯