gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:12:09 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com