51

c# 4 を調べているだけです。この動的なものすべてに頭を悩ませようとしています。この質問がばかげている場合は申し訳ありません。この分野での経験はありません。

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

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

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

4

5 に答える 5

101

「その場で」クラスにメンバーを追加する方法を考えた結果、次のサンプルを思いつきました。

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 インターフェイスを介して追加されることです。キーの存在と値をテスト (および概念を証明) するには、キーに直接アクセスしてコンソールに出力します。

于 2010-08-22T05:57:09.487 に答える
4

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

dynamic obj = new ExpandoObject();
obj.GetDocumentTemplate = () => { ... };
...
obj.GetDocumentTemplate(); // invokes delegate
于 2010-06-04T14:00:10.497 に答える
3

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

これが何に役立つのかを見つけるには、まだ創造性が必要です。UI での動的オブジェクト作成? かっこよく聞こえます:DIは何かを試します。

于 2011-08-04T17:32:37.200 に答える
3

はい、ExpandoObject は、「プロパティ バッグ」にプロパティを動的に追加するように設計されています。ただし、そのようなプロパティにゲッターとセッターを与えるという概念はサポートされていません。少し考えてみれば、それは明らかかもしれません。getter と setter が何をすべきかを既に知っていれば、それはもはや動的プロパティではないでしょう。最も近い方法は、変更を検出できるように 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);
  }

}
于 2010-06-04T13:39:23.867 に答える
2

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

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

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

于 2010-11-04T19:44:02.080 に答える