Як створити власний динамічний тип чи динамічний об’єкт у C #?


130

Наприклад, є властивість ViewBagControllerBase класу, і ми можемо динамічно отримувати / встановлювати значення та додавати до цього об'єкта будь-яку кількість додаткових полів або властивостей, що є крутим. Я хочу використовувати щось подібне, поза додатком 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 .
орад

33

Нещодавно у мене виникла потреба зробити цей крок далі, який полягав у тому, щоб внести доповнення до властивостей у динамічний об'єкт, самим динамічним, на основі визначених користувачем записів. Приклади, наведені в документації на ExpandoObject Microsoft , не стосуються конкретного додавання властивостей динамічно, але можуть враховувати те, як ви перераховуєте та видаляєте властивості. Так чи інакше, я думав, що це може бути корисним для когось. Ось надзвичайно спрощена версія того, як додати дійсно динамічні властивості до 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




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

Або значення присутнє

  var data = new { studentId, StudentName };
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.