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


130

そこでは、例えば、あるViewBagののプロパティControllerBaseクラスと私たちは、動的/設定値を取得し、.Iは、そのようなものを使いたいクールである、このオブジェクトに追加フィールドまたはプロパティの任意の数を追加することができ、MVCアプリケーションとそれ以降Controller他のクラスアプリケーションのタイプ。動的オブジェクトを作成し、そのプロパティを以下のように設定しようとしたとき:

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;

動的な追加と設定のプロパティ。

回答:


279
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クラスの詳細とその他のサンプルについては、実行時に動的にメンバーを追加および削除できるオブジェクトを表します。


3
Visual Studio UserVoiceでこの機能に投票してください。
15

33

最近、私はこれをさらに一歩進める必要がありました。それは、ユーザー定義のエントリに基づいて、動的オブジェクトのプロパティを動的に追加することでした。ここの例、およびMicrosoftのExpandoObjectドキュメントからの例は、プロパティの動的な追加に具体的に対処していませんが、プロパティを列挙および削除する方法から推測できます。とにかく、これは誰かに役立つかもしれないと思いました。以下は、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);

32

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;

11

名前空間に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ご覧ください。


9
dynamic myDynamic = new { PropertyOne = true, PropertyTwo = false};


7
 var data = new { studentId = 1, StudentName = "abc" };  

または値が存在します

  var data = new { studentId, StudentName };
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.