C#Reflection Invoke - 返回通用对象{Type} - 需要类型

时间:2017-01-13 22:43:24

标签: c# entity-framework reflection invoke

我有一个存储过程调用接口,我用它来处理存储过程与实体的结果(使用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类型上的任何常规方法,例如ToArrayToList

我需要一种方法将其转换为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;。

enter image description here

1 个答案:

答案 0 :(得分:0)

由于ObjectResult<T>也实现了非通用IEnumerable接口,因此将其强制转换为此类型并枚举它。

var e = (IEnumerable)t;
foreach (object o in e) {
    //TODO: use o
}