C # Построить анонимный объект динамически - PullRequest
0 голосов
/ 12 ноября 2018

В C # я могу легко создать анонимный объект, подобный этому, во время компиляции:

var items = new {
 Price = 2000,
 Description = "",
 Locations = new List<string> { "", "" }  
};

Мой вопрос: возможно ли создать этот объект во время выполнения?Я слышал о программировании emit / meta , но я не знаю, поможет ли это здесь.

Отмечая, что эти объекты будут созданы внутри цикла for (100 или более элементов), поэтому я рекомендую методы, которые позволяют кэширование типов.

Спасибо.

Обновление - зачем мне это нужно

  • Одним из примеров может быть реализация функциональности Include, напримерв db.Users.Include("Users"), поэтому мне нужно добавить свойство Users во время выполнения по требованию.

1 Ответ

0 голосов
/ 12 ноября 2018

Анонимные типы генерируются во время компиляции и являются просто обычными типами.

Поскольку вы говорите за пределами процесса компиляции, у вас нет опции «генерировать (анонимный) тип во время компиляции»больше, если вы сами не скомпилируете тип в сборку, загруженную сразу после его генерации. System.Reflection.Emit ваш друг здесь.Хотя это довольно дорого.

Лично я бы пропустил все эти неприятности и посмотрел бы на тип, который по своей природе динамичен, например ExpandoObject.Вы можете добавлять свойства, как если бы вы добавляли записи в словарь:

dynamic eo = new System.Dynamic.ExpandoObject();
IDictionary<string, object> d = (IDictionary<string, object>)eo;
d["a"] = "b";

string a = eo.a;

Результат:

enter image description here

...