2009-11-04 17 views
7

私は膨大な数のプロパティを持つオブジェクトを持っています。オブジェクトのプロパティコレクションをループするだけで、それぞれのプロパティの値を取得したいと思います。動的にプロパティ値を取得

私はPropertyInfo.GetValue()メソッドを調べましたが、私のコンテキストではあまり意味がありません。

は、ここで私は(このコードはところで動作しない)何をしようとしているの例です:

foreach(var item in dataObjects) 
    { 
    foreach(PropertyInfo prop in item.GetType().GetProperties()) 
    { 
     String value = prop.GetValue().ToString() 
    } 
    } 

私はプロパティの値を取得すると、この簡単ではないことを今実現しています。私は何が欠けていますか?私はGetValue()メソッドに渡す必要があることを本当に理解していません。なぜなら、私は単にそのメソッドを呼び出すプロパティの値を必要としているからです。

私にはこれを明確にするお手伝いがあります。私は机の上で頭を叩くだけでここで2時間を過ごしました。

prop.GetValue(item, null); 

PropertyInfoがない特定のオブジェクトインスタンスのタイプのプロパティ、およそだけmetatdataです:

+2

これはどのようにしてコンパイルされますか? – Tinister

+2

それはありません。これはコードが実際に何をするのではなく、私が "したい"ものの例です。 :) –

答えて

10

は、あなたが質問にプロパティを呼び出すしたい特定のオブジェクトを提供する必要があります。 PropertyInfoは、それがどのインスタンスから来たのか(それがあった場合)、そのインスタンス/クラスだけを知りません。

ほとんどの場合、PropertyInfoはプロパティの名前と考えることができます。それだけで何かを行うだけの情報ではありません - 私たちは "この名前のプロパティの値を取得する必要があります... 何?"私たちが提供するオブジェクトについて。

3

PropertyInfoは、特定のインスタンスにバインドされたプロパティではなく、プロパティの機械自体(型、取得メソッド、セットメソッドなど)を表します。プロパティが非静的である場合、そのプロパティを読み取るためのインスタンスを用意する必要があります。これはGetValueの最初のパラメータです。換言すれば、pi場合、いくつかのクラスとsomeObjectTestプロパティを表すPropertyInfoことは、そのクラスのインスタンスである:そこ

object a = someObject.Test; 
object b = pi.GetValue(someObject, null); 

両方のラインが同じオブジェクトに同じプロパティの値を取得します。プロパティが静的である場合は、インスタンスを渡す必要はありません(明らかにnullを渡します)。 2番目のパラメータはインデックス付きプロパティのインデックスです - C#はインデックス付きプロパティをサポートしていません(インデクサは全く同じではありません)。したがって、作業している場合を除き、 (VBのように)インデックス付きのプロパティをサポートする言語で書かれたアセンブリからのいくつかの型があります。

関連する問題