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用"分隔每行,就好像它们是同一方法中的每个新参数…我该如何用正确的方法来做呢?
您必须按照通常编写代码的方式编写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 。