【发布时间】:2017-12-11 06:48:57
【问题描述】:
我有Repository<T>,其中T 是BaseEntity 类的派生形式。
Repository<T> 具有 IQueryable<T> Table 属性。我需要调用Table 属性中的FirstOrDefault 方法。
到目前为止,我必须列出存储库,但坚持使用反射调用该方法。
private IEnumerable<object> GetEnumerableRepositoryOf<T>(params object[] constructorArgs) where T : class
{
List<object> objects = new List<object>();
foreach (Type type in
Assembly.GetAssembly(typeof(T)).GetTypes()
.Where(myType => myType.IsClass && !myType.IsAbstract && myType.IsSubclassOf(typeof(T))))
{
objects.Add(Activator.CreateInstance(typeof(Repository<>).MakeGenericType(type), constructorArgs));
}
return objects;
}
var repoList = GetEnumerableRepositoryOf<BaseEntity>(constructorArgs);
foreach (var repo in repoList)
{
// call FirstOrDefault() here
}
【问题讨论】:
-
为什么做的这么奇怪?
-
当然要从每个存储库中获取第一条记录。 :v
-
反射是有代价的,实现这个的想法是什么
-
既然可以返回
IEnumerable<T>,为什么还要返回IEnumerable<object>? -
我的想法是你应该在 Base Repo 中有
FirstOrDefault然后你可以使用T类型调用
标签: c# entity-framework generics reflection system.reflection