gpt4 book ai didi

C# 反射调用 - 返回通用对象 { 类型 } - 需要类型

转载 作者:太空宇宙 更新时间:2023-11-03 15:10:02 25 4
gpt4 key购买 nike

我有一个存储过程调用接口(interface),我用它来处理带有实体的存储过程的结果(使用 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 来表示 t,我也试过使用 Convert.ChangeType .它从不改变对象基类型。动态 t 返回以下错误:

'System.Data.Entity.Core.Objects.ObjectResult<POCOClass>' does not contain a definition for 'ToList'

以为我知道事实确实如此......

为了消除混淆,这里是 watch 屏幕截图。第一行是要返回的内容,我希望它像第二行一样(请参阅类型列)。

编辑:可能会越来越近......我添加了这个:

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

enter image description here

最佳答案

ObjectResult<T>还实现了非通用 IEnumerable接口(interface),将其转换为该类型并枚举它。

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

关于C# 反射调用 - 返回通用对象 { 类型 } - 需要类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41644604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com