Как создать собственный динамический тип или динамический объект в C#?
там, например, ViewBag собственность ControllerBase
класс и мы можем динамически получать / устанавливать значения и добавлять любое количество дополнительных полей или свойств к этому объекту, что круто .Я хочу использовать что-то подобное, помимо приложения MVC и Controller
класса в других типах приложений. Когда я пытался создать динамический объект и установить его свойство, как показано ниже:
1. dynamic MyDynamic = new { A="a" };
2. MyDynamic.A = "asd";
3. Console.WriteLine(MyDynamic.A);
у меня есть RuntimeBinderException
С свойство или индексатор 'f _ _ AnonymousType0.А' не может быть присвоено -- это только для чтения в строке 2. Также я предполагаю, что это не совсем то, что я ищу. Может быть, есть какой-то класс, который может позволить мне сделать что-то вроде:
??? MyDynamic = new ???();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = DateTime.Now;
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42;
с динамическими свойствами добавления и настройки.
5 ответов:
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 и для других примеров: представляет объект, члены которого могут быть динамически добавлены и удалены во время выполнения.
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;
недавно мне пришлось сделать еще один шаг, который заключался в том, чтобы добавить свойства в динамический объект, сами динамические, на основе пользовательских записей. Примеры здесь, и от документация 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);
можно использовать
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