簡體   English   中英

C#反射調用-返回通用對象{類型}-需要類型

[英]C# Reflection Invoke - Returns Generic Object { Type } - Need Type

我有一個存儲過程調用接口,用於處理帶有實體的存儲過程的結果(使用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關鍵字代替t的var,也嘗試使用Convert.ChangeType 它永遠不會從對象基本類型更改。 dynamic t返回以下錯誤:

'System.Data.Entity.Core.Objects.ObjectResult <POCOClass>'不包含'ToList'的定義

以為我知道事實確實如此...

為了消除混亂,請看下面的屏幕截圖。 第一行是返回的內容,我希望它像第二行一樣(請參閱“類型”列)。

編輯 :可能越來越近...我添加了這個:

var listedT = typeof(Enumerable).GetMethod("ToList").MakeGenericMethod(item.GetType()).Invoke(null, new object[] { t });
current.AddRange(listedT); // Error here...

listingT成為object {System.Collections.Generic.List<ReportCatalog.Models.Catalog_Reports>} ,但出現錯誤,無法從對象轉換為System.Collections.Generic.IEnumerable <object>。

在此處輸入圖片說明

由於ObjectResult<T>還實現了非通用IEnumerable接口,因此將其IEnumerable轉換為該類型並枚舉它。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM