none
object型を介した匿名型メンバーへのアクセス RRS feed

  • 質問

  • お世話になっております。

    あるメソッド内で、System.Windows.Forms.ListViewItemのTagへ、次のように匿名型を登録しました。

    public void func1() {
    var item = listView1.Items.Add("SAMPLE");
    item.Tag = new {key="ABC", value = "DEF"}; }

    別のメソッド内で、匿名型メンバーを参照するコードを次のように書きました。

    public void func2()
                foreach (System.Windows.Forms.ListViewItem item in listView1.Items)
                {
                    var tag = item.Tag;
                    var retVal = Query(tag.key);
                }

    こうすると、ビルドエラー「エラー 1 'object' に 'key' の定義が含まれておらず、型 'object' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。」となります。

    var retVal = Query(tag.key); の行を消してビルドすると成功し、var tag = item.Tag; の行にブレイクポイントを置くと、tag には、しっかりkeyとvalueがメンバーとして存在し、値も入っています。

    (string)((dynamic)tag).key)と、tagをいったんobject型ではなくdynamic型?にキャストしてみましたが、ビルドエラー「エラー 2 動的な式のコンパイルに必要な 1 つ以上の型が見つかりません。参照が指定されていることを確認してください。」となります。

    object型変数に匿名型のインスタンスを代入して、ほかの場所で読み取ることは不可能なのでしょうか?.NET Framework上ではうまく動かせるようですが、C#の言語仕様かなにかで制限がかかる(ためにビルドエラーになった)のでしょうか?


    2014年9月30日 8:22

回答

  • 一つのスコープ内で完結しない場合、匿名型の使用をやめて新たなクラスを定義することを検討してください。

    dynamicが使えないのは、.NETバージョンまたは参照が足りてないんでしょう。.NET 4以降で、Microsoft.CSharp.dllを参照する必要があります。

    • 回答としてマーク Always fresh 2014年9月30日 11:00
    2014年9月30日 8:38

すべての返信

  • 一つのスコープ内で完結しない場合、匿名型の使用をやめて新たなクラスを定義することを検討してください。

    dynamicが使えないのは、.NETバージョンまたは参照が足りてないんでしょう。.NET 4以降で、Microsoft.CSharp.dllを参照する必要があります。

    • 回答としてマーク Always fresh 2014年9月30日 11:00
    2014年9月30日 8:38
  • Hongliang様

    どうも有難う御座います。

    今回、クラス定義したオブジェクトで、ベーシックにデータを扱いたいと思います。

    dynamic型は4.0(VS2010)以降で利用できる機能なのですね。


    2014年9月30日 11:03