最简单的解决方案是查看堆栈跟踪并完全删除对该属性的每个显式引用。
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> 的属性设置器方法。如果编译器不再遵循这个命名约定,代码就会中断。
另一种解决方案是从 lambda 表达式派生属性名称。
public static String GetPropertyNameFromLambdaExpression<TObject, TProperty>(
Expression<Func<TObject, TProperty>> expression)
{
return ((MemberExpression)expression.Body).Member.Name;
}
例如
GetPropertyNameFromLambdaExpression<String, Int32>(s => s.Length)
将按预期返回“Length”。代码的生产版本确实需要额外的检查并更好地集成到代码的其余部分中。例如,可以对泛型参数使用类型推断。
更新
还有第三种解决方案 - 您可以在属性 getter 或 setter 中使用 MethodBase.GetCurrentMethod() 来获取 setter 或 getter 方法的名称。
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;