A quick code example shows the usage ( all code here is available as a GitHub:Gist)
One major benefit of the CallerMemberNameAttribute is in a class that implements the INotifyPropertyChanged interface. This interface has an event in the form of PropertyChanged(string propertyName), and will be called from each property's setter method when the value changes. This leads to a lot of magic strings in code, for example:
This brittle code can be avoided by using the attribute like this:
What members does it work with?
As well as methods, properties and events, the attributes will work for these member types:
- Constructor, value is ".ctor
- Explicit conversion operator, value is "op_Explicit"
- Implicit conversion operator, value is "op_Implicit"
- Indexer, value is "Item"
- Operator overload, value is e.g. "op_Addition"
- Finaliser, value is "Finalize"
Where does the info come from?
The attributes work by inspecting the IL of the calling code. For instance, the IL for the Main() method of my first example contains these items of info:
As I said before, all code here is available as a GitHub:Gist