如何使用反射</t>动态获取`SqlQuery <t>`的结果

时间:2014-07-23 11:44:09

标签: c# reflection entity-framework-5

我得到了我想在运行时查询的实体的名称,所以我使用反射来调用SqlQuery<T>

Assembly assm = typeof(DataAccessLayer.MyContext).Assembly;
Type myType = assm.GetTypes().SingleOrDefault(type => type.Name.Equals("Clients"));

MethodInfo genericMethod = typeof(System.Data.Entity.Database).GetMethods()
.Where(method => method.Name == "SqlQuery" && method.IsGenericMethod == 
true).FirstOrDefault();

MethodInfo generic = genericMethod.MakeGenericMethod(myType);

所以这项工作很好我设置了我的参数 - object[] args = { SomeQuery, new object[] { } }; 然后我调用它 - generic.Invoke(db.Database, args);

问题是当我试图获得实际记录时。我尝试将调用分配给这样的变量:

 var records = generic.Invoke(db.Database, args);

但是记录是object的类型,实际上records的值是我传递的sql查询记录调用。 Visual Studio为我提供了加载结果的选项,但似乎只能手动完成。

然后我尝试使用动态像:

 dynamic records = generic.Invoke(db.Database, args);

产生相同的结果,第一个records保存我的sql查询的字符串表示,当我加载结果时,我得到记录作为动态代理,但这就是全部。它更好一点,因为我可以在foreach上使用records时类型是动态的,但我无法从{{1}获得的动态代理中获得任何内容}。

最后我尝试了这个:

foreach

希望这会给我一个类型为 Assembly assm = typeof(DataAccessLayer.BankAttachmentsEntities).Assembly; Type myType = assm.GetTypes().SingleOrDefault(type => type.Name.Equals("Clients")); var listType = typeof(List<>).MakeGenericType(myType); var list = Activator.CreateInstance(listType); 的实例化变量,但似乎并非如此。它仍然被认为是对象,我无法使用List<Clients>或其他自动加载结果的方法。

如何访问这样提取的记录?

0 个答案:

没有答案