Dan*_*tos 11 c# generics controller
我正在尝试在我的MVC C#Entity Framework Application上创建一个通用控制器.
public class GenericRecordController<T> : Controller
{
private DbSet<T> Table;
// ...
public action()
{
// ...
db.Entry(T_Instance).State = System.Data.Entity.EntityState.Modified;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,DbSet < T >和T_Instance行有编译器错误.
类型T必须是引用类型才能将其用作参数.
当我限制它为一个类
Controller where T : class
Run Code Online (Sandbox Code Playgroud)
它解决了.
上述错误意味着什么?
我不是要求解决方案.我想理解为什么会出现这个错误以及为什么限制它来解决它.
Gil*_*een 24
如果你看一下定义Db<TEntity>:
public class DbSet<TEntity> : DbQuery<TEntity>, IDbSet<TEntity>, IQueryable<TEntity>, IEnumerable<TEntity>, IQueryable, IEnumerable, IInternalSetAdapter
where TEntity : class
Run Code Online (Sandbox Code Playgroud)
因为它具有type constraint泛型类型必须是a,class所以必须使用也匹配此条件的类型初始化它:
public class GenericRecordController<T> : Controller where T : class
{ ... }
Run Code Online (Sandbox Code Playgroud)
小智 10
你也可以只用一种方法来做到这一点:
public bool HasKey<T>(T obj) where T : class
{
return _db.Entry<T>(obj).IsKeySet;
}
Run Code Online (Sandbox Code Playgroud)
他们显然对泛型类型有约束.
您需要改变的是:
public class GenericRecordController<T> : Controller where T : class
Run Code Online (Sandbox Code Playgroud)
这告诉编译器只能提供引用类型作为T的类型.
| 归档时间: |
|
| 查看次数: |
16464 次 |
| 最近记录: |