Skip to main content
 首页 » 编程设计

c#之无法从集合中推断泛型类型

2024年01月25日23jirigala

为什么不能这样做:

public static void Init<TEntity>(params TEntity[] repositories) where TEntity : Entity 
{ 
    foreach (TEntity item in repositories) 
    { 
       Repository<item> rep = new Repository<item>(); 
    } 
} 

以上代码无法编译:无法解析符号项

但这行得通:

public static void Init<TEntity>(TEntity entity) where TEntity : Entity 
{ 
    Repository<TEntity> rep = new Repository<TEntity>(); 
} 

编辑

我正在编辑 OP 以更全面地了解问题。我们遇到了由多个存储库生成的 Entity Framework Db 上下文的一些问题。目前我们访问存储库如下:

Repository<Product> rep = new Repository<Product>() 
Repository<Account> rep = new Repository<Account>() 

由于产品和帐户之间存在关系,因此 EF 会提示对象附加到不同的上下文。因此,我们试图通过将存储库访问整合到工作单元模式中来解决这个问题:

这是我正在尝试实现的示例:

public class UnitOfWork 
{ 
    protected List<Entity> Repositories = new List<Entity>(); 
    private readonly DbContext _context; 
    protected UnitOfWork() 
    { 
       _context = new SqlDbContext(); 
    } 
 
    public static UnitOfWork Init<TEntity>(params TEntity[] repositories) where TEntity : Entity 
    { 
            UnitOfWork uow = new UnitOfWork(); 
        foreach (TEntity item in repositories) 
        { 
            Repository<item> rep = new Repository<item>(); 
            uow.Repositories.Add(rep); 
        } 
            return uow; 
    } 
 
    public IRepository<T> GetRepository<T>() where T : Entity 
    { 
        return Repositories.OfType<T>().Single(); 
    }    
} 

因此我们可以像这样访问我们的存储库:

GetRepository<Product>().GetById(1); 
GetRepository<Account>().GetById(123434); 

请您参考如下方法:

item是一个类型的实例,但您需要一个类型参数来创建您的泛型 Repository<T> 的实例类。