2009-07-29 12 views
81

私はこれを持っています:C#で匿名型のプロパティにアクセスするには?

List<object> nodes = new List<object>(); 

nodes.Add(
new { 
    Checked  = false, 
    depth  = 1, 
    id   = "div_" + d.Id 
}); 

...私は匿名オブジェクトの "チェック"プロパティをつかむことができますか?これが可能なのかどうかはわかりません。しようとしました:

if (nodes.Any(n => n["Checked"] == false)) ...しかし、それは動作しません。

ありがとう

答えて

52

あなたは匿名型の強く型付けされたリストが必要な場合は、あまりにもリストに匿名型を作成する必要があります。これを行う最も簡単な方法は、配列などの配列をリストに投影することです。その後

var nodes = (new[] { new { Checked = false, /* etc */ } }).ToList(); 

あなたは同じようにアクセスできるようになります。そのための方法の

nodes.Any(n => n.Checked); 

コンパイラの作品、あなたがリストを作成した後も、動作するはずですし、次の匿名型理由彼らは同じタイプであるように同じ構造を持っています。私はこれを確認するために手渡すコンパイラを持っていません。

nodes.Add(new { Checked = false, /* etc */ }); 
200

オブジェクトをタイプobjectとして保存する場合は、リフレクションを使用する必要があります。これは、匿名またはその他のオブジェクトタイプに当てはまります。

object v = p.GetValue(o, null); 

:次に、そこからあなたが値を取得することができます

PropertyInfo p = t.GetProperty("Foo"); 

Type t = o.GetType(); 

が続いているから、プロパティを検索します。oオブジェクト上では、その型を得ることができますこの回答はC#4用のアップデートでは長年にわたって期限切れです:

dynamic d = o; 
object v = d.Foo; 

そして今C#6で別の代替:

object v = o?.GetType().GetProperty("Foo")?.GetValue(o, null); 

?.を使用することによって、我々は結果vは、3つの異なる状況でnullにさせること!

  1. onullなので、何のオブジェクトはすべて
  2. oではありませんが非nullですが、プロパティを持っていないFoo
  3. oプロパティFooを持っているが、その真の価値がnullであることを起こります。

これはこれまでの例と同じではありませんが、3つのケースすべてを同じに扱う場合は意味があります。

+4

はC#4 = Dこのために良い、今まで前に.NET 4.0 – Alan

+1

woowのための素晴らしいアップデートをダイナミックに使ったことがありません私にとっては – ch2o

+0

のC#4ソリューションでは、プロパティが存在しない場合( 'object v = d.Foo')、' GetValue(o、null) 'が存在しない場合はnullになります。 – kobe

12

Reflectionを使用して匿名型のプロパティを反復処理できます。 「Checked」プロパティが存在するかどうか、そしてその値が取得されるかどうかを確認してください。

このブログ記事を参照してください。 http://blogs.msdn.com/wriju/archive/2007/10/26/c-3-0-anonymous-type-and-net-reflection-hand-in-hand.aspx

だから、のようなもの:

foreach(object o in nodes) 
{ 
    Type t = o.GetType(); 

    PropertyInfo[] pi = t.GetProperties(); 

    foreach (PropertyInfo p in pi) 
    { 
     if (p.Name=="Checked" && !(bool)p.GetValue(o)) 
      Console.WriteLine("awesome!"); 
    } 
} 
+4

1つのプロパティだけが必要で、その名前をすでに知っている場合、それらのすべてを通過する必要はありません。 GetPropertyとGetValueを使用するだけです。また、System.out.printlnはJavaであり、C#ではありません。 –

+0

おっと、そうです、Chris!少し恥ずかしい...今すぐ固定。 – glennkentwell

関連する問題