web-dev-qa-db-ja.com

不明な(設計時の)プロパティをExpandoObjectに追加する

c#4を探索するだけです。この動的なものすべてに頭を回そうとしています。この質問が愚かで、このドメインでの経験がない場合は、申し訳ありません。

ExpandoObjectがあり、実行時にパブリックプロパティを(getおよびsetで)追加したい場合、どうすればよいですか?

たとえば、documentTemplateとdocumentを指すプロパティを持つドキュメントがあります。このdocumentTemplateには、いくつかのタグTitles(例:学生間で開発された機能)があり、ドキュメント(例:集中力、メモリなど)を作成するときに対処する必要があります。したがって、テンプレートがドキュメントに設定されたらすぐに、テンプレートのタグタイトルと同じ名前のプロパティを持つクラスを作成します。次に、PropertyGridなどのいくつかのUI要素を使用して、ユーザーにタイトルにタグ値を入力します。

読んでくれてありがとう!

49
virtualmic

「オンザフライ」でクラスにメンバーを追加することはどのように可能かと思い、次のサンプルを思いつきました。

using System;
using System.Collections.Generic;
using System.Dynamic;

class Program
{
    static void Main()
    {
        dynamic expando = new ExpandoObject();
        var p = expando as IDictionary<String, object>;

        p["A"] = "New val 1";
        p["B"] = "New val 2";

        Console.WriteLine(expando.A);
        Console.WriteLine(expando.B);
    }
}

このコードスニペットのポイントは、メンバーAとBが文字列リテラル(ハードコード/文字列化)として定義され、ExpandoObjectのIDictionaryインターフェイスを介して追加されることです。キーに直接アクセスしてコンソールに出力することにより、キーの存在と値をテストします(概念を証明します)。

94
Paul Sasik

デリゲートプロパティをExpandoObjectに追加して、メソッドとほぼ同じように機能させることができます。例えば。、

dynamic obj = new ExpandoObject();
obj.GetDocumentTemplate = () => { ... };
...
obj.GetDocumentTemplate(); // invokes delegate
4
Stephen Cleary

はい、ExpandoObjectは「プロパティバッグ」にプロパティを動的に追加するように設計されています。ただし、そのようなプロパティにゲッターとセッターを与えるという概念はサポートされていません。少し考えてみるとそれは明らかかもしれません。ゲッターとセッターが何をすべきかをすでに知っていれば、それは動的プロパティではなくなります。取得できる最も近いのは、変更を検出できるようにINotifyPropertyChangedイベントを実装することです。いくつかのサンプルコード:

using System;
using System.Dynamic;
using System.ComponentModel;

class Program {
  static void Main(string[] args) {
    dynamic obj = new ExpandoObject();
    obj.test = 42;     // Add a property
    Console.WriteLine(obj.test);

    var inpc = (INotifyPropertyChanged)obj;
    inpc.PropertyChanged += inpc_PropertyChanged;
    obj.test = "foo";
    Console.ReadLine();
  }

  static void inpc_PropertyChanged(object sender, PropertyChangedEventArgs e) {
    Console.WriteLine("'{0}' property changed", e.PropertyName);
  }

}
3
Hans Passant

これまでの回答は基本をかなりカバーしていますが、このMSDN Magazineの記事も共有する価値があると感じました。

http://msdn.Microsoft.com/en-us/magazine/ff796227.aspx

動的XML入力を使用してExpandoObjectsを動的に作成および使用するいくつかの例を取り上げます。

2
Yoopergeek

私はこの興味深い事実を発見しました:ExpandoObjectへのXAMLバインディングは、バインディングがアクセスしようとしているプロパティも作成します

これが何に役立つのかを知るには、まだ創造力が必要です。 UIでの動的オブジェクトの作成?いいね:D何か試してみるよ。

2
Alex Maker