174

たとえば、クラスのViewBagプロパティがあり、ControllerBase値を動的に取得/設定し、このオブジェクトに任意の数のフィールドまたはプロパティを追加できます。これはすばらしいことです。他の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;

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

4

7 に答える 7

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

于 2012-10-03T13:21:31.423 に答える
42

私は最近、これをさらに一歩進める必要がありました。それは、ユーザー定義のエントリに基づいて、動的オブジェクトにプロパティを追加し、それ自体を動的にすることでした。ここでの例と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);
于 2016-08-29T14:58:04.510 に答える
34

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;
于 2012-10-03T13:21:20.440 に答える
30
dynamic myDynamic = new { PropertyOne = true, PropertyTwo = false};
于 2019-10-17T15:19:05.597 に答える
16
 var data = new { studentId = 1, StudentName = "abc" };  

または値が存在します

  var data = new { studentId, StudentName };
于 2019-11-19T12:42:38.963 に答える
15

名前空間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++; });

詳細については、 ExpandoObjectMSDNを参照してください。

于 2012-10-03T13:55:52.210 に答える
7
dynamic MyDynamic = new ExpandoObject();
于 2012-10-03T13:23:17.930 に答える