当查询给定类型的所有对象的实体框架时,你会做这样的事情:
List<MyDesiredObjects> = _myContext.MyDesiredObjects.ToList();
但是有没有办法可以创建一个函数来查询EF以查找给定类型的所有对象(如果类型是可变的)?我已经创建了这个函数,它至少可以编译:
private List<TEntity> GetFromEF<TEntity>() where TEntity : class
{
MyDBEntities context = new UnityDBEntities(_entityConnection);
IObjectContextAdapter adapter = (IObjectContextAdapter)context;
System.Data.Objects.ObjectContext oContext = adapter.ObjectContext;
return oContext.CreateObjectSet<TEntity>().ToList();
}
但是我很难看到我怎么称呼它,更别提实际从中提取数据了。使用反射,像这样(ucm.MappingType是一个Type):
MethodInfo method = typeof(BaseXmlReader).GetMethod("GetFromEF");
MethodInfo gMethod = method.MakeGenericMethod( ucm.MappingType.GetType() );
var meh = gMethod.Invoke(null, null);
对象引用未设置为对象实例时失败。我甚至还没有分页我的名单。
任何其他方法来解决这个问题?
答案 0 :(得分:1)
解决您的空MethodInfo method
:
GetMethod
只会搜索公众成员。您可以将方法更改为公开,或者包括非公开方法,如下所示:
MethodInfo method = typeof(BaseXmlReader)
.GetMethod("GetFromEF",
BindingFlags.Instance | BindingFlags.NonPublic);
另外,我假设您的GetFromEF方法位于名为BaseXmlReader的类上?如果没有,则需要用类名替换。
然后你可以像这样调用:
BaseXmlReader instance = new BaseXmlReader();
MethodInfo method = typeof(BaseXmlReader)
.GetMethod("GetFromEF",
BindingFlags.Instance | BindingFlags.NonPublic);
MethodInfo gMethod = method.MakeGenericMethod(typeof(ucm.MappingType));
var result = gMethod.Invoke(instance, null);
或者像这样从内部调用:
MethodInfo method = typeof(BaseXmlReader)
.GetMethod("GetFromEF",
BindingFlags.Instance | BindingFlags.NonPublic);
MethodInfo gMethod = method.MakeGenericMethod(typeof(ucm.MappingType));
var result = gMethod.Invoke(this, null);