【问题标题】:Query Entity Framework for list of dynamic type查询实体框架以获取动态类型列表
【发布时间】:2013-11-18 15:08:40
【问题描述】:

当查询给定类型的所有对象的实体框架时,你会做这样的事情:

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 是一个类型):

MethodInfo method = typeof(BaseXmlReader).GetMethod("GetFromEF");
MethodInfo gMethod = method.MakeGenericMethod(  ucm.MappingType.GetType() );
var meh = gMethod.Invoke(null, null);

由于对象引用未设置为对象实例而失败。而且我什至还没有分页我的列表。

还有其他方法可以解决这个问题吗?

【问题讨论】:

  • 你从哪里得到异常?是在调用方法时还是在 GetFromEF 中?
  • 它在 method.MakeGenericMethod - 但我刚刚发现那是因为 method 为空。
  • 调用泛型方法的一种方式是这样的:var list = GetFromEF&lt;MyDesiredObjects&gt;(); 无需进入反射。 msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx
  • 您可能需要向 GetMethod 提供这些绑定标志,以使其能够获取您的私有方法 BindingFlags.NonPublic | BindingFlags.Instance
  • 调用的第一个参数需要是BaseXmlReader的实例,不能在空实例上调用

标签: c# entity-framework generics reflection


【解决方案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);

【讨论】:

  • 它实际上是从内部调用的,所以 Invoke 是 gMethod.Invoke(this, null) ...但主体是相同的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
相关资源
最近更新 更多