Starting with C# 5.0, you can tag optional parameters with one of three caller info attributes, which instruct the compiler to feed information obtained from the caller’s source code into the parameter’s default value:
[CallerMemberName]
applies
the caller’s member name.
[CallerFilePath]
applies the
path to the caller’s source code file.
[CallerLineNumber]
applies
the line number in the caller’s source code file.
The Foo
method in the following
program demonstrates all three:
using System; using System.Runtime.CompilerServices; class Program { static void Main() { Foo(); } static void Foo ([CallerMemberName]
string memberName = null,[CallerFilePath]
string filePath = null,[CallerLineNumber]
int lineNumber = 0) { Console.WriteLine (memberName); Console.WriteLine (filePath); Console.WriteLine (lineNumber); } }
Assuming our program resides in c:source estProgram.cs, the output would be:
Main c:source estProgram.cs 8
As with standard optional parameters, the substitution is done at
the calling site. Hence, our Main
method is syntactic sugar for this:
static void Main() { Foo ("Main", @"c:source estProgram.cs", 8); }
Caller info attributes are useful for writing logging functions, and
for implementing change notification patterns. For instance, a method such as the following can
be called from inside a property’s set
accessor—without having to specify the property’s name:
void RaisePropertyChanged (
[CallerMemberName]
string propertyName = null)
{
...
}