我正在尝试使用模板模式和 C# 泛型来编写一个实用程序,该实用程序将为任何 DbContext 中的任何 DbSet 列出数据库中的实体。我想我需要三个泛型:
public class lister<TDbSet, TContext, TEntity>
where TDbSet : DbSet<IPEntity>
where TContext : DbContext
were TEntity : IPEntity
(IPEntity 是我们所有实体类的抽象基类。)除了尝试编写 LINQ 表达式来获取结果集之外,一切似乎都很愉快。由于“TDbSwt”实际上是 TContext 的一个成员,我不知道 LINQ 是否会让你做类似的事情:
from x in TContext.TDbSet select x
它肯定不喜欢那一行,无论我是否在 TDbSet 前加上 TContext。
有人知道我该如何设置吗?现在我有单独的(非常小,但每个实体一个)类用于实体和 LINQ 细节,但随着我们从几十个增长到数百个甚至数千个实体,我想找到一个更紧凑和优雅的解决方案。
谢谢。
最佳答案
from x in TContext.TDbSet select x
这行不通的原因有两个:
-
TContext
是一种类型,但您尝试对其调用的成员不是静态的,因此您需要一个TContext
的实例 -
TDbSet
也是一种类型。只因为TContext
碰巧有一个与TDbSet
同名(甚至同类型)的成员并不意味着您可以开始使用TDbSet
作为成员名称而不是类型。
你想要的大概是这样的:
public class lister<TEntity>
where TEntity : IPEntity
{
private DbContext _context;
private DbSet<TEntity> Set
{
get { return _context.Set<TEntity>(); }
}
public lister(DbContext context)
{
_context = context;
}
}
现在在那个类中你可以写:
from x in Set select x
它会如您所愿地工作。
或者,您可能需要 lister
自己实例化上下文。这不太可能是你应该做的,但如果没有看到你的整体设计,我不能确定。在这种情况下,您会想要:
public class lister<TEntity, TContext>
where TEntity : IPEntity
where TContext : DbContext, new()
{
private TContext _context;
private DbSet<TEntity> Set
{
get { return _context.Set<TEntity>(); }
}
public lister()
{
_context = new TContext();
}
}
可能会有一些变化。例如,您可能希望从另一个方法而不是构造函数传入或实例化您的上下文。
关于c# - 无法找出具有多个和包含的泛型对象的 C# 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23410106/