使用反射创建通用存储库<t>

时间:2015-10-12 04:23:43

标签: c# reflection

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

我正在尝试以下内容。

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

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

您无法合理地为任意类型创建存储库。

如果对象不需要任何共同点,则存储库代码将不知道如何处理它们。您将如何编写代码来处理Customer,ComplexNumber和System.Object?

如果您关注的对象确实具有足够的共同点,以便能够以通用方式对待它们,请使用公共基类或使用它们全部实现的接口来表达这种共性。然后就可以了

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

答案 1 :(得分:1)

您可以使用MakeGenericTypeActivator

在运行时创建通用对象
var _unitofWork = new UnitOfWork();
var objRepository = Activator.CreateInstance(typeof(Repository<>).MakeGenericObject(Type.GetType("EntityName")), _unitofWork);

唯一的问题是Activator.CreateInstance返回一个对象。没有所有泛型类型的通用接口,没有简单的方法来访问任何成员。也许你有一个像IRepository这样的界面,它不需要你可以使用的通用。在这种情况下,将CreateInstance的返回值强制转换为它。如果您没有这样的界面,则必须使用反射或dynamic如果您调用无效成员,则会导致运行时错误。