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
{
get
{
return _userName;
}
set
{
_userName=value;
RaisePropertyChanged();
}
}
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).