Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#CodeDom Console.WriteLine+;方法参考_C#_Methods_Codedom_Console.writeline - Fatal编程技术网

C#CodeDom Console.WriteLine+;方法参考

C#CodeDom Console.WriteLine+;方法参考,c#,methods,codedom,console.writeline,C#,Methods,Codedom,Console.writeline,我正在尝试使用CodeDom创建控制台.WriteLine语句(如下所示)。这主要是因为环境.NewLine调用-我无法找到在Console.WriteLine调用中嵌入方法的正确方法。我将向您展示我试图生成的代码以及我正在使用的代码。也许有人能抓住我,纠正我的错误 我想生成的代码: Console.WriteLine("Error reading from source: " + Environment.NewLine + "Error code: " + ex.Message); cons

我正在尝试使用CodeDom创建
控制台.WriteLine
语句(如下所示)。这主要是因为
环境.NewLine
调用-我无法找到在Console.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);
我正在使用的代码:

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);
正在生成的代码:

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用“,”分隔每一行,就好像它们是同一方法中的每个新参数一样。。。如何以正确的方式进行此操作?

使用重载并执行与

Console.WriteLine("Error reading from source: {0} Error code: {1}", 
    Environment.NewLine, 
    ex.Message);

在CodeDom中。

您必须以与正常编写代码相同的方式编写CodeDom。也就是说,当你想用一个参数调用一个方法时,你必须给它一个参数

此外,如果您希望在生成的代码中有一个常量,正确的方法是使用
CodePrimitiveExpression
。您试图创建一个名为
“从源读取时出错:
”的变量

由于手工构造整个表达式将非常繁琐且不可读,因此可以创建一个助手方法,使用同一个运算符连接多个表达式:

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

您可以使用程序员解决问题的方法-忽略它们。您可以尝试
“错误读取源:{0}错误代码:{1}”
…它也更干净:)好的-我很快就能测试出来。我一开始工作就汇报。非常感谢。