我有一个存储过程调用接口,我用它来处理存储过程与实体的结果(使用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
。它永远不会从对象基类型更改。 dynamic t返回以下错误:
'System.Data.Entity.Core.Objects.ObjectResult&LT; POCOClass&GT;'不包含'ToList'的定义
以为我知道它确实......
为了清除混乱,这是一个手表截图。第一行是返回的内容,我希望它像第二行一样(参见Type列)。
修改:可能会越来越近......我补充说:
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&lt; object&gt;。
答案 0 :(得分:0)
由于ObjectResult<T>
也实现了非通用IEnumerable
接口,因此将其强制转换为此类型并枚举它。
var e = (IEnumerable)t;
foreach (object o in e) {
//TODO: use o
}