创建通用存储库<与反思

本文关键字:存储 创建 | 更新日期: 2023-09-27 18:17:08

如何为自定义对象创建存储库对象?当我创建repo对象时,我不知道CustomEntity类型。

我正在尝试下面的事情。

var _unitofWork = new UnitOfWork();
var objRepository = new Repository<Type.GetType("EntityName")>(_unitofWork);

有人能帮忙吗?

创建通用存储库<与反思

您不能合理地为任意类型创建存储库。

如果对象没有任何共同之处,存储库代码将不知道如何处理它们。如何编写代码来处理Customer、ComplexNumber和System.Object?

如果你所关心的对象确实有足够的共同点,能够以一种共同的方式对待它们,那么用一个共同的基类或它们都实现的接口来表达这种共性。然后你可以输入

var rep = new Repository<IMyCommonalities>(_unitOfWork);

你可以使用MakeGenericType和Activator在运行时创建一个泛型对象

var _unitofWork = new UnitOfWork();
var objRepository = Activator.CreateInstance(typeof(Repository<>).MakeGenericObject(Type.GetType("EntityName")), _unitofWork);

唯一的问题是Activator.CreateInstance返回一个对象。如果没有所有泛型类型的公共接口,就不可能轻松地访问任何成员。也许你有一个像IRepository这样的接口,它不需要你可以使用的泛型。在这种情况下,将CreateInstance的返回值转换为它。如果您没有这样的接口,则必须使用反射或动态,如果调用无效成员,则会导致运行时错误。