2016-01-12 3 views
2

На StackExchange есть несколько вопросов, но они не охватывают тот же случай. Прочтите его, прежде чем отмечать его как дубликат!CodeDom InitExpression для типизированного словаря типа

Использование CodeDom в C#, я пытаюсь сгенерировать выражение Init для словаря. например

Dictionary<int,string> dict = new Dictionary<int,string>{ 
    {1,"one"}, 
    {2,"two"} 
}; 

Я нашел другие решения, которые используют CodeExpression для создания экземпляра объекта, а затем несколько CodeStatements, населяющих экземпляр, но из-за кучу скучных причин того, что это путь, который я предпочел бы не пойти вниз ,

Чтобы уточнить, так как я не могу использовать несколько CodeStatements, я своего рода нужно избежать образования что-то вроде этого:

Dictionary<int,string> dict = new Dictionary<int,string>(); 
dict.Add(1,"one"); 
dict.Add(2,"two"); 

Мой вопрос:Есть ли способ для генерации кода, как это с помощью только CodeDom.CodeExpression (s)?

Я уверен, что на данный момент ответ «нет», но подумал, что стоит на всякий случай спросить.

+0

Итак, у вас есть 100000 предметов, которые необходимо вставить в словарь? Слишком скучно писать этот код? Это ваша проблема? Откуда берутся эти предметы? Из базы данных или что-то еще? –

+1

Является ли 'CodeSnippetExpression' (т. Е. Строя выражение самостоятельно как строку) приемлемым? – svick

+0

@ KosalaW Это больше похоже на то, что я пытаюсь отразить корпус данных, который поддерживает словари внутри списков внутри структур внутри списков внутри структур и т. Д. И т. Д. Построение дерева выражений для инициализации этих вещей отлично работает, но после добавления операторов я должен начать беспокоиться о контексте (например, они должны быть в методе и не могут использоваться для инициализации массива) – JBeFat

ответ

1

Насколько я могу судить, вы не можете выразить инициализаторы коллекции в объектной модели CodeDOM. Но есть способ обойти это: CodeSnippetExpression. Используя это, вы можете создать строку, которая непосредственно содержит любое выражение C#, которое вы хотите, и использовать его внутри другого объекта CodeDOM.

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

1

Нет, если вы хотите использовать инициализаторы коллекции, вам нужно будет использовать выражения LINQ вместо CodeDOM, например. System.Linq.Expressions.ListInitExpression.

+0

Это не имеет большого значения для меня, выражения LINQ имеют тенденцию иметь очень разные варианты использования, чем CodeDOM. Вы не можете просто заменить его другим. – svick

Смежные вопросы