爲什麼不可能做到這一點:無法從集合推斷泛型類型
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,以便更全面地瞭解問題。我們遇到了由多個存儲庫產生的實體框架Db Context的一些問題。目前我們訪問像庫:
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);
我不知道爲什麼你需要做到這一點。如果您知道該項目的類型爲TEntity,並且您嘗試從項目類型創建通用Repository,那麼爲什麼不直接執行Repository? –
你的第一個代碼顯然是錯誤的,泛型是基於T的編譯時功能,其中T是一個實際的類型參數,比如'string'或'Foo'。你試圖讓T變成一個變量,這是不行的。但是你真的需要做什麼? –
我們遇到了跨多個存儲庫管理實體框架上下文的問題,因此試圖將所有存儲庫放入工作單元模式,以便我們可以使用DbContext的單個實例。 – Fixer