2011-11-09 5 views
3

動的オブジェクトのプロパティにインデックスでアクセスする方法はありますか?この例ではC#DynamicObject:インデックスでプロパティにアクセスする方法はありますか?

List<dynamic> list = _dataStagingManager.GetStatusList(consoleSearch); 
foreach (var row in list) 
{ 
    Console.WriteLine(row[0]); 
    Console.WriteLine(row[1]); 
} 

、行のプロパティ名[0]ストアドプロシージャ列の別名の結果に応じて異なります。

+0

どのような動的オブジェクトですか?あなたはどこからそれを手に入れますか? – svick

+0

最初は、一般的な動的オブジェクトタイプのDynamicObjectを使用していました。 Dapperによって返された動的オブジェクトがこのオブジェクトを拡張し、KeysおよびValuesプロパティを含むことが分かります – Abe

答えて

1

一般に、これは不可能です。たとえば、可能なすべてのプロパティを持つ動的オブジェクトを作成できます。

class AnythingGoes : DynamicObject 
{ 
    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     result = binder.Name; 
     return true; 
    } 
} 

プロパティのリストを取得できる可能性があります。動的オブジェクトが実際には通常のオブジェクト(IDynamicMetaObjectProviderを実装していないオブジェクト)である場合、通常のリフレクションは正常に動作します。

オブジェクトが実際に(IDynamicMetaObjectProviderを実装して)動的である場合は、GetMetaObject()から返さDynamicMetaObjectGetDynamicMemberNames()を呼び出してみてください。しかし、上の例が示すように、これは動作することが保証されていません。

-2

rowのランタイムタイプに整数のインデクサーがある場合は、コードはそのままで済みます。

+1

この例を挙げてください。基本的には、リストのタイプのオブジェクトがあります。このオブジェクトには、Dapper Dot Netによってマップされたストアドプロシージャからのデータ結果セットが含まれています。 – Abe

+0

私はDapper Dot Netに精通していません。しかし、たとえば行がADO.NET DataRowの場合、式row [0]は実行時にインデクサに送られ、インデクサは最初の列に格納された値を返します(row [1]は2番目に、等) – phoog

4

残念ながら、実行時オブジェクト(反復可能/反復可能なメンバの反復可能なコレクションを持つ)とは異なり、デフォルトでは、そのようなコレクションはありません。彼らはメンバーが名前でアクセスできるように実装することができます。動的オブジェクトのインデックスは、自分で実装することを選択しないと、考えられません。

インデックスタイプのサポートを提供するには、動的タイプのTryGetIndexメソッドをオーバーライドします。

+0

もちろん。 「残念ながら、いいえ」は正しいとは思われません。動的オブジェクトをどのようにコードするかによって異なります。私の答えを参照 –

+0

はい。しかし、私は、OPは、不可能な動的オブジェクト(おそらく彼が制御しているものではない)のメンバーを反復する*汎用目的の方法を探していたと思う。 –

+0

もしそうなら、私は間違っています。申し訳ありませんdownvote :( –

0

私はDapper Dot Netに精通していませんが、それを見てからは、匿名タイプを動的オブジェクトとして返すように見えます。それらをPOCO(単純な古いCLRオブジェクト)として見ることができます。つまり、個々の名前付きプロパティを持つクラスであり、インデックスでフィールドにアクセスするために必要なインデクサーを実装していない可能性があります。

あなたは似た何かを達成するためにリフレクションを使用して試みることができる:

foreach (dynamic propInfo in row.GetType().GetProperties()) 
{ 
    Console.WriteLine("{0}: {1}", propInfo.Name, propInfo.GetValue(row, null)); 
} 

私はあなたがが、ストアドプロシージャは、それらを返しているのと同じ順序でプロパティを取得しますかわかりません。

+1

あなたの例で 'row.GetType()'はnullを返します。 –

関連する問題