【发布时间】:2017-02-02 14:53:40
【问题描述】:
我有一个存储过程调用接口,我用它来处理带有实体的存储过程的结果(使用Translate 方法将我们的存储过程的结果转换为可以在 EF 中正常跟踪和使用的实体)
这是基本代码...
List<object> current = new List<object>();
object item = ((Type)currenttype.Current).GetConstructor(System.Type.EmptyTypes).Invoke(new object[0]);
ObjectContext actualContext = ((IObjectContextAdapter)context).ObjectContext;
string className = "";
EntityContainer container = null;
string setName = "";
className = ((Type)currenttype.Current).ToString();
container = actualContext.MetadataWorkspace.GetEntityContainer(((IObjectContextAdapter)context).ObjectContext.DefaultContainerName, DataSpace.CSpace);
setName = (from meta in container.BaseEntitySets
where meta.ElementType.FullName == className
select meta.Name).FirstOrDefault();
var t = typeof(ObjectContext).GetMethod("Translate", new Type[] { typeof(DbDataReader), typeof(string), typeof(MergeOption) }).MakeGenericMethod(item.GetType()).Invoke(actualContext, new object[] { reader, setName, MergeOption.AppendOnly });
问题是我不能用我想要的't'做任何事情,它的类型被列为object {System.Data.Entity.Core.Objects.ObjectResult<POCOClass>}。我无法调用我通常可以在 ObjectResult 类型上调用的任何常规方法,例如 ToArray 或 ToList。
我需要一种方法将其转换为System.Data.Entity.Core.Objects.ObjectResult<POCOClass>。不同之处在于“t”首先被列为类型对象。
我不能使用任何强类型转换,因为类型会根据存储过程而改变。我尝试使用 dynamic 关键字而不是 var for t 并且我也尝试使用 Convert.ChangeType。它永远不会从对象基类型改变。动态 t 返回以下错误:
“System.Data.Entity.Core.Objects.ObjectResult
”不包含“ToList”的定义
我以为我知道它确实是一个事实......
为了消除混淆,这里有一个手表屏幕截图。第一行是返回的内容,我希望它像第二行一样(参见类型列)。
编辑:可能越来越近了...我添加了这个:
var listedT = typeof(Enumerable).GetMethod("ToList").MakeGenericMethod(item.GetType()).Invoke(null, new object[] { t });
current.AddRange(listedT); // Error here...
listedT 变为 object {System.Collections.Generic.List<ReportCatalog.Models.Catalog_Reports>},我收到错误消息,无法从对象转换为 System.Collections.Generic.IEnumerable
【问题讨论】:
-
你的意思是说你正在输入
System.Data.Entity.Core.Objects.ObjectResult<POCOClass>,但你真的想要输入POCOClass? -
不,我正在获取对象 {System.Data.Entity.Core.Objects.ObjectResult
},我只想要 System.Data.Entity.Core.Objects.ObjectResult 。 .. -
object { ... }是什么意思?它是一个装箱值吗?如果是这种情况,则意味着ObjectResult<>是一个值类型。 -
Olivier Jacob-Descombes - 我不确定盒装是什么意思。它是 {System.Data.Entity.Core.Objects.ObjectResult
} 类型的通用对象。如果我将它转换为 {System.Data.Entity.Core.Objects.ObjectResult } 那么我可以访问 ToArray/ToList 等...但是,POCOClass 直到运行时才知道,所以我不能明确投它。我觉得我需要能够使用反射来投射结果。 -
我已经为此工作了很长时间,我已经准备好承认这是不可能的。根据我的阅读,从 .Invoke 返回的值是一个装箱对象,在编译时不知道类型的情况下,您无法将其拆箱。
标签: c# entity-framework reflection invoke