きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

log4net × Assemblyファイルの設定 × 属性の名前付きパラメータ

久しぶりのlog4netのDeep Diveの続きになります。
今回は、log4netを読んでいるうちに知ったCustomAttributeの設定方法、定義方法についてまとめます。

log4netを利用する時、logの出力設定を定義した設定ファイル(log4net.config)を用意します。
さらにlog4net本体にlog4net.configの場所を教えてあげるため、AssemblyInfo.csファイルに以下の呪文を記載する必要があります。

呪文↓

[assembly: log4net.Config.XmlConfigurator(Watch = true,ConfigFile =@".\config\log4net.config")]

この呪文を唱えることで、log4netの起動時(LogManagerでGetLoggerメソッドを呼び出したとき)に、configFileで指定されたパスに存在するlog4net.configファイルを見つけられるようになります。

さて、この呪文、なぜWatch=trueのように定義しているのでしょうか。
確かに、このXmlConfiguratorクラスはWatchと、ConfigFileという名前のプロパティを持っています。
しかし、コンストラクタに、それら2つの値を受け付けるものは定義されていませんでした。
では、なぜ、上記のようにコンストラクタ風のメソッドを呼ぶときに同時にプロパティに値を設定できるのでしょうか・・・

と迷っていたら下のブログに行き着きました。
属性 | C# プログラミング解説

[ 属性クラス( 位置パラメータ, 名前付きパラメータ = 値 ) ]

ここでいう位置パラメータがコンストラクタの引数で、
名前付きパラメータはプロパティ及びフィールドとのことでした。

ということで、Watch=trueとかの記述方法についての謎が解けました!


なお、普通のクラスファイルの実装などで記述できる名前付きパラメータは以下のようになっています。
・代入したい変数名:代入したい値
Sampleコードは以下の通りです。

 //エントリポイント
 static void Main(string[] args)
 {
     logger.Debug("Test");
      //引数をあえて逆順に定義
      Test(b:"",a:"");
}

 private static void Test(string a, string b)
 {

 }

まとめ

属性クラスの設定方法で利用できる「名前付きパラメータ」と、
普通の実装で利用できる「名前付きパラメータ」は、それぞれ代入記号が異なります。
普通の実装で=(等号)を使って名前付きパラメータを使おうとすると、代入処理として認識されますので注意します!