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 キーワードをスキップすることであり、呼び出し元は最後の例で長い署名を使用する必要があります。