Самое простое решение - посмотреть трассировку стека и полностью удалить все явные ссылки на свойство.
public String Name
{
get { return this.name; }
set
{
if (value != this.name)
{
this.RaisePropertyChanging();
this.name = value;
this.RaisePropertyChanged();
}
}
}
private String name = null;
private void RaisePropertyChanged()
{
String propertyName =
new StackTrace().GetFrame(1).GetMethod().Name.SubString(4);
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler(new PropertyChangedEventArgs(propertyName));
}
}
Код получает имя свойства через трассировку стека из метода вызова - это метод установки свойства с именем set_<PropertyName>
. Если компилятор больше не следует этому соглашению об именах, код нарушается.
Другое решение - извлечь имя свойства из лямбда-выражения.
public static String GetPropertyNameFromLambdaExpression<TObject, TProperty>(
Expression<Func<TObject, TProperty>> expression)
{
return ((MemberExpression)expression.Body).Member.Name;
}
Например
GetPropertyNameFromLambdaExpression<String, Int32>(s => s.Length)
вернет "Length
" как ожидается. Производственная версия кода действительно требует дополнительных проверок и лучшей интеграции с остальной частью кода. Например, можно использовать вывод типа для общих аргументов.
UPDATE
И есть третье решение - вы можете использовать MethodBase.GetCurrentMethod()
внутри метода получения или установки метода получения имени метода установки или метода получения.
public String Name
{
get { return this.name; }
set
{
if (value != this.name)
{
String propertyName = MethodBase.GetCurentMethod().Name.SubString(4);
this.RaisePropertyChanging(propertyName);
this.name = value;
this.RaisePropertyChanged(propertyName);
}
}
}
private String name = null;