私はストアドプロシージャの結果をエンティティで処理するために使用しているストアドプロシージャ呼び出しインターフェイスを持っています(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>}
と記載されています。 ToArray
やToList
のような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 <オブジェクトにオブジェクトから変換することはできません。近づいされる可能性があります...私はこれを追加しました>。
あなたがをSystem.Data.Entity.Core.Objects.ObjectResult 'しかし、あなたが本当に' POCOClass'を入力したい 'タイプを取得していると言うことを意味しますか? –
Quantic
いいえ、私はオブジェクト{System.Data.Entity.Core.Objects.ObjectResult}を取得していますが、私はSystem.Data.Entity.Core.Objects.ObjectResultをほしいとします。 ... –
Brad
'オブジェクト{... } 'mean?それは箱入りの価値ですか?この場合、 'ObjectResult <>'は値型であることを意味します。 –