c# - 无法找出具有多个和包含的泛型对象的 C# 泛型

标签 c# linq generics

我正在尝试使用模板模式和 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

这行不通的原因有两个:

  1. TContext是一种类型,但您尝试对其调用的成员不是静态的,因此您需要一个 TContext实例
  2. 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/

相关文章:

c# - 如何使用 nhibernate 和 LINQ 将多个连接(获取)添加到连接表?

c# - 为什么我不能在泛型中使用 Type.GetType()?

java - Java中访客模式的通用实现

C# 和 OpenSSL : Differing Output for AES Encryption

c# - 如何在使用 C# 更新 Windows 窗体中的文本框时编写 "flash"效果?

c# - C#中的字符串常量内存池

c# - Dynamics CRM 2011 - LINQ - 检索客户和联系人之间的连接

C# LINQ 多个一对多包含 where 条件

C# 包含值类型和字符串的通用约束

c# - 静态成员变量是否对所有 C# 泛型实例化都是通用的?