C# CodeDom Console.WriteLine + MethodReference

本文关键字:MethodReference WriteLine Console CodeDom | 更新日期: 2023-09-27 18:03:02

我试图使用CodeDom创建一个Console.WriteLine语句(如下所示)。这是给我主要是因为Environment.NewLine调用-我不能找出正确的方式嵌入一个方法在控制台。WriteLine电话。我将向您展示我正在尝试与我正在使用的代码一起产生的代码。也许有人能发现并纠正我的错误。

我希望生成的代码:
Console.WriteLine("Error reading from source: " + Environment.NewLine + "Error code: " + ex.Message);

我使用的代码:

const char quote = ''u0022'; // Represents a " mark
CodeMethodInvokeExpression invoke = new CodeMethodInvokeExpression(
new CodeTypeReferenceExpression("Console"), "WriteLine",
new CodeExpression[] {
new CodeVariableReferenceExpression(quote + "Error reading from source: " + quote + " + "),
new CodeFieldReferenceExpression("Environment"), "NewLine"),
new CodeVariableReferenceExpression("+ " + quote + "Error code: " + quote + " + " + "ex" + ".Message")})));

正在生成的代码:

Console.WriteLine("Error reading source: " + , Environment.NewLine, + "Error code: " + ex.Message);

因为我使用MethodInvoke, CodeDom用"分隔每行,就好像它们是同一方法中的每个新参数…我该如何用正确的方法来做呢?

C# CodeDom Console.WriteLine + MethodReference

您必须按照通常编写代码的方式编写CodeDOM。也就是说,当你想调用一个只有一个参数的方法时,你必须给它一个参数。

另外,如果您想在生成的代码中有一个常量,正确的方法是使用CodePrimitiveExpression。您正在尝试创建一个名称为"Error reading from source: "的变量。

由于手工构造整个表达式既繁琐又难以阅读,因此可以创建一个helper方法,使用相同的操作符连接多个表达式:

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()的格式过载可能会更好。

使用控制台。WriteLine(String, Object[])重载并执行与

相同的操作
Console.WriteLine("Error reading from source: {0} Error code: {1}", 
    Environment.NewLine, 
    ex.Message);
在CodeDom