我希望实现一个完全通用的CRUD API,任何类类型都可以通过上下文传递并进行通用保存、更新等操作。
我有一个存储库可以像这样保存任何模型类型:
public class Repository<T> : IRepository<T> where T : class
{
private Context _db = new Context();
public T Add(T newItem)
{
var result = _db.Set<T>().Add((T)newItem);
_db.SaveChanges();
return result;
}
}
这个继承自一个通用接口,该接口实现了所有“add”方法:
public interface IRepository<T> where T : class
{
T Add(T newItem);
}
我不明白为什么不能将泛型类型传递给存储库接口的新实例?我希望能够像下面这样实现:
var data = new Data(){
Id = 1
};
IRepository<data.GetType()> repo = new Repository<data.GetType()>();
这允许我将任何类型传递到方法中,并根据此生成正确的接口。
虽然它允许我传递具体类型,但这有点违背了泛型的初衷。
如果有任何想法或解释为什么不可能,请不吝赐教 - 谢谢。
Data
作为通用类型直接传入。你已经知道它是什么,它是一个Data
- 它不可能是Foo
或Bar
。泛型是为了编译时类型安全,而不是运行时类型安全。如果直到运行时才知道类型,则泛型可能不是适合你的解决方案。 - JamiecIRepository
可以使用,这样代码就可以工作了:IRepository repo = new Repository<data.GetType()>();
?(如果我们可以修复<data.GetType()>
部分的话) - Lasse V. Karlsen<T>
部分的值,这是不可能的。您需要有一个非泛型类型,可以将其存储进去。 - Lasse V. Karlsen