rksoftware

Visual Studio とか C# とかが好きです

C# 2.0 以降の新機能の確認 - C# 5.0 - 呼び出し元情報の属性 (CallerMemberName など)

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

呼び出し元情報の属性 (CallerMemberName など)

 https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/caller-information
 メソッドの呼び出し元の情報を省略可能な引数として取得できる。メソッドを呼び出す際に引数を省略すると、呼び出し元のメソッド名などが設定される。
 つまり、呼び出されたメソッド側で呼び出したメソッドの情報を知ることができる。

static void Main(string[] args)
{
    MyMethod();         // message: message
                        // member name: MyMethod
                        // source file path: XXXXX\XXXXX\Program.cs
                        // source line number: 21
    MyProperty = 10;    // MyProperty changed: 0-> 10
}

// このメソッドの引数についている属性
// これらの属性のついた引数を省略してメソッドを呼び出す
static void WriteTrace(string message,
        [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
        [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
        [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
{
    Console.WriteLine(string.Format("message: {0}", message));
    Console.WriteLine(string.Format("member name: {0}", memberName));
    Console.WriteLine(string.Format("source file path: {0}", sourceFilePath));
    Console.WriteLine(string.Format("source line number: {0}", sourceLineNumber));
}

// これが頻繁に使う属性
// ここではプロパティの set から呼ばれていて、変更されたプロパティ名を出力することに使っている
static void WritePropertyChanged(object oldValue,
    object newValue,
    [System.Runtime.CompilerServices.CallerMemberName] string name = "")
{
    Console.WriteLine(string.Format("{0} changed: {1} -> {2}", name, oldValue, newValue));
}

static void MyMethod()
{
    WriteTrace("message");
}

private static int _myProperty;
static int MyProperty {
    get { return _myProperty; }
    set { WritePropertyChanged(_myProperty, value); _myProperty = value; }
}