CodeDom и инициализаторы коллекций

Есть ли способ создать инициализатор словаря с помощью C# CodeDom? Они вообще поддерживаются?

Я бы хотел:

private IDictionary<string, string> map = new Dictionary<string, string>
{
    { "Name", "Value" },
    ...
};

person Igal Tabachnik    schedule 15.06.2010    source источник


Ответы (2)


Это невозможно при использовании конструкций CodeDom. Они не были обновлены для инициализаторов коллекций.

У LukeH есть отличный пост в блоге на тему возможностей 3.5 и CodeDom.

person JaredPar    schedule 15.06.2010
comment
Боялся, что дело в этом... Все равно спасибо! - person Igal Tabachnik; 16.06.2010
comment
Сообщение в блоге, указанное выше, объясняет, что CodeDom не был обновлен для новых функций C# 3.0, и дает пример использования CSharpCodeProvider.CompileAssemblyFromSource для компиляции строки кода, содержащей выражение LINQ. - person foson; 04.12.2020

Вы можете это сделать, но это, возможно, самый страшный кошмар на свете. Вот как я это делаю сейчас. (Обновлен мой ответ, чтобы отразить вопрос)

var constructDictionary = new CodeMemberField("Dictionary<string, string> map", @" = new Dictionary<string, string>()
{
   { Name, Value },
}");

Это также может быть заполнено еще раз хакерским.

string builder += " = new Dictionary<string, string>(){";
for(int i = 0; i < 10; i++)
{
   builder+="{ Name"+i+", Value"+i+" }";
}
var constructDictionary = new CodeMemberField("Dictionary<string, string> map", builder+" }");
person Levon Ravel    schedule 03.11.2018