9

C# 5.0 Caller Information と C# params キーワードを組み合わせようとしています。意図は、ロギング フレームワークのラッパーを作成することであり、ロガーでテキストを String.Format のようにフォーマットする必要があります。以前のバージョンでは、メソッドは次のようになりました。

void Log(
   string message,
   params object[] messageArgs = null);

これを次のように呼びます。

log.Log("{0}: I canna do it cap'n, the engines can't handle warp {1}!", 
        "Scotty", warpFactor);

ここで、発信者情報をキャプチャしてログに記録したいと考えています。したがって、署名は次のようになります。

void Log(
    string message,
    params object[] messageArgs,
    [CallerMemberName] string sourceMemberName = null);

params は最後のパラメーターでなければならないため、これはコンパイルされません。だから私はこれを試します:

void Log(
    string message,
    [CallerMemberName] string sourceMemberName = null,
    params object[] messageArgs);

sourceMembername を提供するか、名前付きパラメーターとして明示的に messageArgs 引数を割り当てることなく、それを呼び出す方法はありますか? これを行うと、params キーワードの目的が無効になります。

// params is defeated:
log.Log("message", 
        messageArgs: new object[] { "Scotty", warpFactor });
// CallerMemberName is defeated:
log.Log("message", null,
        "Scotty", warpFactor);

これを行う方法はありますか?発信者情報が渡される「ハッキー」な方法では、params キーワードを使用できないようです。呼び出し元のメンバー情報パラメーターが実際にはパラメーターではないことを C# コンパイラが認識できれば、すばらしいことです。それらを明示的に渡す必要はないと思います。

私のバックアップは params キーワードをスキップすることであり、呼び出し元は最後の例で長い署名を使用する必要があります。

4

4 に答える 4