Implementing INotifyPropertyChanged typically requires the use of magic strings
, and I've never been happy with the various workarounds available
. They either affect performance or require a lot of extra developer ceremony (which is no good in big teams).
I'd always been hoping that C# would introduce something similar to the "typeof
" operator that would help you get the name of the current property (or method) without having to use any slow reflection. Before the "//BUILD/" conference, I had given up on C# 5 bringing in anything useful here.
But then I was reading Colin Jack's summary
of the //BUILD/ talk on Future directions for C# and Visual Basic
, and was particularly interested by the new Caller Info Attributes feature of C# 5. This feature is not in the CTP of VS11 yet, so I can't test it, but I expect you'll be able to write the following RaisePropertyChanged method:
protected void RaisePropertyChanged([CallerMemberName] string member = "")
var copy = PropertyChanged;
if(copy != null)
copy(new PropertyChangedEventArgs(this, member));
and now when you call this method from a property setter, leaving out the optional parameter:
public string UserName
the compiler will fill out the parameter for you, passing "UserName" to the RaisePropertyChanged method.
What I like about this is that the compiler is creating the magic string for you on every compile - so when you rename your property, the string is automatically kept in sync. This is the best of both worlds, we get the performance benefits of a hardcoded string literal, while keeping everything DRY (and therefore hard to inadvertently break).