拡張メソッドを使うと、新しい派生型を作成したり、再コンパイルしたり、元の型をその他の方法で変更したりすることなく、既存の型にメソッドを追加できます。静的メソッドとして定義されますが、呼び出すときはインスタンスメソッドの構文を使います。最初の仮引数の前にはthis修飾子を付け、そのメソッドが操作する型を指定します。また、拡張メソッドは名前空間レベルでスコープに取り込まれます。
public static int WordCount(this string str)
{
return str.Split().Length;
}
"Hello World".WordCount();
// => 2
この演習では、ログ行を処理します。
ログ行はそれぞれ、"[<LEVEL>]: <MESSAGE>"という形式の文字列です。
ログレベルは3種類あります。
INFOWARNINGERRORタスクはいくつかあり、それぞれが1つのログ行を受け取って、それに対して何かを行うものです。
先月のログを見てみると、テストメッセージがいつも特定の部分文字列の後ろにあることがわかります。近いうちにテストメッセージを取り出す必要が出てきそうなので、そのためのヘルパーメソッドを作ることにします。
実装するのは、何らかの文字列の区切り文字を受け取り、その区切り文字より後ろの部分文字列を返す、(static)LogAnalysis.SubstringAfter()拡張メソッドです。
var log = "[INFO]: File Deleted.";
log.SubstringAfter(": "); // => returns "File Deleted."
さらに詳しく調べてみると、ログレベルはいつも角括弧([と])の間にあることがわかります。こちらも近いうちにログレベルを取り出す必要が出てきそうなので、そのためのヘルパーメソッドをもう1つ作ることにします。
実装するのは、2つの文字列の区切り文字を受け取り、その2つの区切り文字の間にある部分文字列を返す、(static)LogAnalysis.SubstringBetween()拡張メソッドです。
var log = "[INFO]: File Deleted.";
log.SubstringBetween("[", "]"); // => returns "INFO"
実装するのは、ログに含まれるメッセージを返す、(static)LogAnalysis.Message()拡張メソッドです。
var log = "[ERROR]: Missing ; on line 20.";
log.Message(); // => returns "Missing ; on line 20."
実装するのは、ログのログレベルを返す、(static)LogAnalysis.LogLevel()拡張メソッドです。
var log = "[ERROR]: Missing ; on line 20.";
log.LogLevel(); // => returns "ERROR"