Как создать собственный динамический тип или динамический объект в С#?
Здесь, например, ViewBag свойство класса ControllerBase
, и мы можем динамически получать/устанавливать значения и добавлять любое количество дополнительные поля или свойства для этого объекта. Это классно. Я хочу использовать что-то подобное, помимо приложения 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;
с динамическими свойствами добавления и настройки.
Ответы
Ответ 1
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 и дополнительных образцах: представляет объект, члены которого могут быть динамически добавлены и удалены во время выполнения.
Ответ 2
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;
Ответ 3
Недавно мне нужно было сделать еще один шаг, который должен был сделать дополнения свойств в динамическом объекте, сами динамические, на основе пользовательских записей. В примерах здесь и из документации 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);
Ответ 4
Вы можете использовать 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
Ответ 5
dynamic MyDynamic = new ExpandoObject();
Ответ 6
var mydynamic = new {PropertyOne = true, PropertyTwo = false};