![](/img/trans.png)
[英]C# Reflection Invoke - Object of Type 'XXX' Cannot Be Converted to type 'System.Object[]'
[英]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類型上使用的任何常規方法,例如ToArray
或ToList
。
我需要一種將其轉換為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.