web-dev-qa-db-ja.com

C#で独自の動的タイプまたは動的オブジェクトを作成する方法は?

たとえば、 ViewBagControllerBaseクラスのプロパティであり、値を動的に取得/設定し、このオブジェクトに任意の数の追加のフィールドまたはプロパティを追加できます。これはクールです。 、MVCアプリケーションおよび他のタイプのアプリケーションのControllerクラスを超えて。 dynamic オブジェクトを作成し、そのプロパティを以下のように設定しようとしたとき:

1. dynamic MyDynamic = new { A="a" };
2. MyDynamic.A = "asd";
3. Console.WriteLine(MyDynamic.A);

メッセージでRuntimeBinderExceptionを取得しましたプロパティまたはインデクサー '<> f__AnonymousType0.A'に割り当てることができません-2行目で読み取り専用ですそれは私が探しているものではないことをお勧めします。たぶん、次のようなことができるクラスがあります:

??? MyDynamic = new ???();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = DateTime.Now;
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42;

プロパティを動的に追加および設定します。

112
Dmytro
dynamic MyDynamic = new System.Dynamic.ExpandoObject();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.Number = 12;
MyDynamic.MyMethod = new Func<int>(() => 
{ 
    return 55; 
});
Console.WriteLine(MyDynamic.MyMethod());

ExpandoObject class の詳細とその他のサンプルを参照してください。実行時にメンバーを動的に追加および削除できるオブジェクトを表します。

245
Mario Sannum

ExpandoObjectが探しています。

dynamic MyDynamic = new ExpandoObject(); // note, the type MUST be dynamic to use dynamic invoking.
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42;
30
nothrow

私は最近、これをさらに一歩進める必要がありました。これは、ユーザー定義のエントリに基づいて、動的オブジェクトに動的にプロパティを追加することでした。ここの例、および MicrosoftのExpandoObject documentation からの例は、プロパティの動的な追加を具体的に扱っていませんが、プロパティを列挙および削除する方法から推測できます。とにかく、私はこれが誰かに役立つかもしれないと思った。以下は、ExpandoObjectに真に動的なプロパティを追加する方法の非常に簡略化されたバージョンです(キーワードおよびその他の処理を無視します)。

        // my pretend dataset
        List<string> fields = new List<string>();
        // my 'columns'
        fields.Add("this_thing");
        fields.Add("that_thing");
        fields.Add("the_other");

        dynamic exo = new System.Dynamic.ExpandoObject();

        foreach (string field in fields)
        {
            ((IDictionary<String, Object>)exo).Add(field, field + "_data");
        }

        // output - from Json.Net NuGet package
        textBox1.Text = Newtonsoft.Json.JsonConvert.SerializeObject(exo);
26
AlienFromCA

ExpandoObject Class名前空間にあるSystem.Dynamicを使用できます。

dynamic MyDynamic = new ExpandoObject();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.SomeProperty = SomeValue
MyDynamic.number = 10;
MyDynamic.Increment = (Action)(() => { MyDynamic.number++; });

詳細は ExpandoObject MSDN にあります。

10
Kishore Kumar
dynamic MyDynamic = new ExpandoObject();
7
Davecz