Вы должны написать CodeDOM так же, как обычно. То есть, когда вы хотите вызвать метод с одним аргументом, вы должны дать ему один аргумент.
Также, если вы хотите иметь константу в сгенерированном коде, правильный способ - использовать CodePrimitiveExpression
. Вы пытаетесь создать переменную с именем "Error reading from source: "
.
Поскольку создание всего выражения вручную было бы утомительным и нечитаемым, вы можете создать вспомогательный метод для объединения нескольких выражений с использованием одного и того же оператора:
static CodeExpression Join(
CodeBinaryOperatorType op, params CodeExpression[] expressions)
{
return expressions.Aggregate((l, r) => new CodeBinaryOperatorExpression(l, op, r));
}
Теперь вы можете написать:
new CodeMethodInvokeExpression(
new CodeTypeReferenceExpression(typeof(Console)), "WriteLine",
Join(CodeBinaryOperatorType.Add,
new CodePrimitiveExpression("Error reading from source: "),
new CodePropertyReferenceExpression(
new CodeTypeReferenceExpression(typeof(Environment)),
"NewLine"),
new CodePrimitiveExpression("Error code: "),
new CodePropertyReferenceExpression(
new CodeVariableReferenceExpression("ex"), "Message")));
Который производит следующий код:
System.Console.WriteLine(((("Error reading from source: " + System.Environment.NewLine)
+ "Error code: ")
+ ex.Message))
Конечно, вы всегда можете использовать фрагменты:
new CodeMethodInvokeExpression(
new CodeTypeReferenceExpression(typeof(Console)), "WriteLine",
new CodeSnippetExpression(
"\"Error reading from source: \" + Environment.NewLine + \"Error code: \" + ex.Message"));
Кроме того, использование перегрузки форматирования Console.WriteLine()
может быть лучше.