在C#中有一个很好的强类型方法来做PropertyChanged事件吗?

Dav*_*vy8 10 c# strong-typing inotifypropertychanged

更改属性的名称并期望Visual Studio中的重命名功能必须处理所有必需的重命名,但INotifyPropertyChanged的PropertyChanged事件的属性名称除外.有没有更好的方法以某种方式获得强类型,所以你不需要记得手动重命名它?

Mar*_*ell 8

编辑:nameof抵达c#6.耶!


没有nameof/ infoofetc; 这是很多讨论,但它就是这样.

有一种方法可以在.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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


uli*_*i78 6

C#5似乎有一个解决方案.使用可与参数一起使用的CallerMemberName属性(网络上的一个示例).

class Employee : INotifyPropertyChanged
{
    private string _Name;
    public string Name
    {
        get { return _Name; }

        set
        {
            _Name = value;
            RaisePropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged([CallerMemberName] string caller = "")
    {
        var temp = PropertyChanged;

        if ( temp != null )
        {
            temp( this, new PropertyChangedEventArgs( caller ) );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)