更改属性的名称并希望Visual Studio中的重命名功能能够处理所有必要的重命名,这在某种程度上是很常见的事件,但INotifyPropertyChanged的PropertyChanged事件的属性名称除外。是否有更好的方法以某种方式将其强类型化,因此您无需记住手动重命名它?

最佳答案

编辑:nameof到达了C#6。

没有nameof/infoof等;人们对此进行了很多讨论,但事实就是如此。

有一种方法可以在.NET 3.5中使用lambda表达式(并解析表达式树)来实现此目的,但实际上这并不值得。现在,我只是坚持使用字符串(如果确定不破坏它,则要进行单元测试)。

using System;
using System.ComponentModel;
using System.Linq.Expressions;
using System.Reflection;
class Program : INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged;
    static void Main() {
        var p = new Program();
        p.PropertyChanged += (s, a) => Console.WriteLine(a.PropertyName);
        p.Name = "abc";
    }
    protected void OnPropertyChanged<T>(Expression<Func<Program, T>> property) {
        MemberExpression me = property.Body as MemberExpression;
        if (me == null || me.Expression != property.Parameters[0]
              || me.Member.MemberType != MemberTypes.Property) {
            throw new InvalidOperationException(
                "Now tell me about the property");
        }
        var handler = PropertyChanged;
        if (handler != null) handler(this,
          new PropertyChangedEventArgs(me.Member.Name));
    }
    string name;
    public string Name {
        get{return name;}
        set {
            name = value;
            OnPropertyChanged(p=>p.Name);
        }
    }
}

关于c# - 有没有一种很好的强类型方法来在C#中执行PropertyChanged事件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1128091/

10-12 17:28
查看更多