0

Console.WriteLineCodeDom を使用してステートメント (以下を参照) を作成しようとしています。これは主にEnvironment.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);

私は を使用しているためMethodInvoke、CodeDom は各行を「,」で区切っており、あたかもそれらが同じメソッド内のそれぞれの新しいパラメーターであるかのようです...どうすればこれを適切に行うことができますか?

4

2 に答える 2

1

通常のコードと同じ方法で CodeDOM を作成する必要があります。つまり、引数が 1 つのメソッドを呼び出したい場合は、引数を 1 つ指定する必要があります。

また、生成されたコードに定数が必要な場合は、 を使用するのが適切な方法です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()方が良い場合があります。

于 2011-07-19T22:55:40.873 に答える
0

Console.WriteLine(String, Object[])オーバーロードを使用して、同等のことを行います

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

コードドムで。

于 2011-07-19T18:01:48.317 に答える