我们在 C# 中有一个抽象的泛型类,非常像这样:
public abstract class Repository<T>
where T: Entity
{
public abstract void Create(T t);
public abstract T Retrieve(Id id);
//etc.
}
我们有一些派生类,例如:
public class EventRepository
: Repository<Event>
{
//etc.
}
我们正在实现一个工作单元模式,它保留一个字典来将实体类型映射到存储库类型,以便在需要创建或更改实体时,它知道要实例化哪个存储库:
private Dictionary<Type, Type> m_dicMapper;
该字典已初始化并加载了所有映射,如下所示:
m_dicMapper.Add(typeof(Event), typeof(EventRepository));
//and so on for a few other repository classes.
e
然后,当需要创建实体时,例如:
//retrieve the repository type for the correct entity type.
Type tyRepo = m_dicMapper[e.GetType()];
//instantiate a repository of that type.
repo = Activator.CreateInstance(tyRepo);
//and now create the entity in persistence.
repo.Create(e);
问题是,repo
上面代码中的类型是什么?我想将它声明为泛型Repository<T>
类型,但显然 C# 不会让我这样做。以下行均未编译:
Repository repo;
Repository<T> repo;
Repository<e.GetType()> repo;
我可以将它声明为var
,但是我无法访问实现的Create
和其他方法Repository<T>
。我希望能够使用通用类来通用地使用存储库!但我想我做错了什么。
所以我的问题是,我可以使用哪些编码和/或设计的解决方法来解决这个问题?谢谢你。