2012-03-27 9 views
56

私はいくつかのプロパティを含むクラスを持っています(すべてが違いがあればすべてが文字列です)。
私はまた、クラスの多くの異なるインスタンスを含むリストを持っています。c#foreach(オブジェクトのプロパティ)...これを行う簡単な方法はありますか?

私は、リスト内の各オブジェクトをループしたかったし、そのオブジェクトの各プロパティをループを決めた私のクラスのためのいくつかのユニットテストを作成している間...

私はこれを行うことと同じくらい簡単だろうと思いました。 ..

foreach (Object obj in theList) 
{ 
    foreach (Property theProperties in obj) 
    { 
     do some stufff!!; 
    } 
} 

しかし、これはうまくいきませんでした!

い:( 私はこのエラーを取得...

「『Application.Objectは』 『GetEnumeratorメソッド』のパブリック定義が含まれていないので、foreach文は、型の変数 『Application.Object』を操作することはできません」 IFSとループのトンなしまたは複雑すぎるものに入ることなくこれを行う方法のいずれかを知っている

+4

今後、「動作しません」とは言わないでください。代わりに、問題を特定してください(コンパイラエラーなど)。ありがとう! –

+0

更新済み!ヘッドアップありがとうRobert – Jammerz858

答えて

91

これを試してみてください:?

foreach (PropertyInfo propertyInfo in obj.GetType().GetProperties()) 
{ 
    // do stuff here 
} 

Type.GetProperties()がどの過負荷を持っていることに注意してくださいアクセシビリティレベルなどの異なる基準でプロパティをフィルタリングできるようにバインディングフラグのセットを受け取ります。詳細はMSDNを参照してください。Type.GetProperties Method (BindingFlags) "system.Reflection"アセンブリ参照を追加することを忘れないでください。すべてのパブリックプロパティ解決するために、例えば

​​

を私は期待通り、これが動作するかどうかをお知らせください。ほとんどがこの

SomeClass A = SomeClass(...) 
PropertyInfo[] properties = A.GetType().GetProperties(); 
+1

オブジェクトプロパティのハンドルを取得したら、各プロパティの値を取得する方法はありますか?例:名前または郵便番号 – JsonStatham

2

使用リフレクション、あなただけのプロパティは、コレクションやプロパティバッグの形でアクセス可能であることを期待するのではなく、タイプからプロパティを取得する必要があります:

var property in obj.GetType().GetProperties() 

you can access like soそこから:

property.Name 
property.GetValue(obj, null) 

のWi th GetValue 2番目のパラメータでは、コレクションを返すプロパティで動作するインデックス値を指定できます。文字列は文字の集合であるため、必要に応じて文字を返すインデックスを指定することもできます。

12

Your'eを行うには

+0

誰かを怒らせましたか?私はこれについて何が間違っているかを知っています。そうでなければ、決して学ばないかもしれません。 –

+0

あなたのコードが間違っていたら(忍者の編集の前に)、おそらくダウンボートがあります。 –

13

確かに、問題はない:

foreach(object item in sequence) 
{ 
    if (item == null) continue; 
    foreach(PropertyInfo property in item.GetType().GetProperties()) 
    { 
     // do something with the property 
    } 
} 
+0

なぜこの行を追加しましたか? 'if(item == null)continue;'個人的には、その時点でヌルオブジェクトを取得していれば、何かが間違っていて、それが有効な場所になっているのでしょうか、間違っていますか? – Dementic

+0

@Dementic:確かに、シーケンスにはnull以外の参照が含まれている必要があります。 –

20

あなたはこのようなオブジェクトのすべての非インデックス付きプロパティをループすることができます:GetProperties()戻りインデクサだけでなく、単純なプロパティ以来

var s = new MyObject(); 
foreach (var p in s.GetType().GetProperties().Where(p => !p.GetGetMethod().GetParameters().Any())) { 
    Console.WriteLine(p.GetValue(s, null)); 
} 

nullを第2パラメータとして渡すことが安全であることを知るには、GetValueを呼び出す前に追加のフィルタが必要です。

書き込み専用またはそれ以外のアクセスできないプロパティを除外するには、フィルタをさらに変更する必要があります。

+0

+1実際に使用できるプロパティを使って何かを行うだけで、書き込み専用のプロパティを除外することもできます。 – hvd

+0

@hvd書き込み専用プロパティの優れた点です!私はそれらについてほとんど忘れてしまった。私のコードは、 'null'ゲッタを持つプロパティに遭遇するとクラッシュするでしょうが、私はOPが彼が必要とするプロパティだけを取得する方法を理解するでしょう。 – dasblinkenlight

+1

値を取得する方法を示すために上に投票しました –

0

"do some stuff"とは、訪問する実際のプロパティの値を更新することを意味し、ルートオブジェクトから訪問されたプロパティへのパスに沿って構造体タイプのプロパティがある場合は、プロパティのルートオブジェクトに反映されません。

関連する問題