C# で匿名型のプロパティにアクセスするにはどうすればいいですか? 質問する

C# で匿名型のプロパティにアクセスするにはどうすればいいですか? 質問する

私はこれを持っています:

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

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

...そして、匿名オブジェクトの「Checked」プロパティを取得できるかどうか疑問に思っています。これが可能かどうかはわかりません。これを試してみました:

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

ありがとう

ベストアンサー1

オブジェクトを 型 として保存する場合はobject、リフレクションを使用する必要があります。これは、匿名かどうかに関係なく、すべてのオブジェクト型に当てはまります。オブジェクト o では、その型を取得できます。

Type t = o.GetType();

次に、そこからプロパティを検索します。

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

そこから値を取得できます:

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

この回答は、C# 4 への更新が長らく遅れています。

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

そして、C# 6 には別の選択肢があります:

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

を使用すると、?.結果が3 つの異なる状況にvなることに注意してください。null

  1. oなのでnull、オブジェクトはまったく存在しません
  2. o非-nullだが、プロパティを持たないFoo
  3. oには プロパティがありますFooが、その実際の値は ですnull

したがって、これは前の例と同等ではありませんが、3 つのケースすべてを同じように扱いたい場合には意味があるかもしれません。

使用するには動的ユニットテストで匿名型のプロパティを読み取るには、プロジェクトのコンパイラサービスにアセンブリをテストプロジェクトの内部で表示するように指示する必要があります。プロジェクト(.proj)ファイルに次のコードを追加できます。このリンク詳細については。

<ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
        <_Parameter1>Name of your test project</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>

おすすめ記事