2017-01-13 3 views
2

私はストアドプロシージャの結果をエンティティで処理するために使用しているストアドプロシージャ呼び出しインターフェイスを持っています(Translateメソッドを使用して、それは通常通りEFで追跡して使用することができます)C#Reflection Invoke - 汎用オブジェクトを返します。{Type} - タイプが必要です。

ここで基本的なコードです...

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>}と記載されています。 ToArrayToListのようなObjectResult型で通常できる通常のメソッドは呼び出すことができません。

System.Data.Entity.Core.Objects.ObjectResult<POCOClass>に変換する方法が必要です。違いは、 't'が型オブジェクトとして最初にリストされていることです。

タイプがストアドプロシージャによって変わるため、厳密に型指定されたキャストは使用できません。私はtの代わりにvarの代わりにdynamicキーワードを使ってみました。また、Convert.ChangeTypeを使ってみました。オブジェクトの基本型から変更されることはありません。ダイナミックトンに戻り、この次のエラー:私はそれがないという事実を知っている

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

思想...

が混乱を解消するには、ここでは時計のスクリーンショットです。最初の行が返されます。2番目の行と同じにします(「型」の列を参照)。

編集

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

+0

あなたがをSystem.Data.Entity.Core.Objects.ObjectResult 'しかし、あなたが本当に' POCOClass'を入力したい 'タイプを取得していると言うことを意味しますか? – Quantic

+0

いいえ、私はオブジェクト{System.Data.Entity.Core.Objects.ObjectResult }を取得していますが、私はSystem.Data.Entity.Core.Objects.ObjectResultをほしいとします。 ... – Brad

+0

'オブジェクト{... } 'mean?それは箱入りの価値ですか?この場合、 'ObjectResult <>'は値型であることを意味します。 –

答えて

0

ObjectResult<T>も非ジェネリックIEnumerableインタフェースを実装しているため、この型にキャストし、それを列挙。

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

私はこれを試しました。 ToList()をeで実行することはできません。私は 'IEnumerable'には 'ToList'の定義が含まれていません...私は既にトップでSystem.Linqを使用しています...(IEnumerable )tのようにキャストすれば - 期待どおりに動作し、私は呼び出すことができますToList()... – Brad

+0

currentType.Currentをパラメータとして渡す機会があれば、[Generic Methods](https://msdn.microsoft.com/en-us/library/twcad0zb)を使用することをお勧めします。 aspx)アプローチ。この状況では、LINQ、ToListなどの厳密な型指定された機能を使用することができます。それ以外の場合は、Olivier Jacot-Descombesのアプローチを使用してforeachループを使用してオブジェクトのリストを作成します。 – Uranus

関連する問題