是否可以将属性更改为属性?

时间:2014-08-08 09:45:21

标签: c# wpf inotifypropertychanged

我找到了一个Propperty Changed Event的实现,我可以在没有Web中属性名称的情况下调用属性。然后我在这里建立了一个扩展方法

public static void OnPropertyChanged(this INotifyPropertyChanged iNotifyPropertyChanged, string    propertyName = null)
{
    if (propertyName == null)
        propertyName = new StackTrace().GetFrame(1).GetMethod().Name.Replace("set_", "");
    FieldInfo field = iNotifyPropertyChanged.GetType().GetField("PropertyChanged", BindingFlags.Instance | BindingFlags.NonPublic);
    if (field == (FieldInfo) null)
        return;
    object obj = field.GetValue((object) iNotifyPropertyChanged);
    if (obj == null)
        return;
    obj.GetType().GetMethod("Invoke").Invoke(obj, new object[2]
    {
        (object) iNotifyPropertyChanged,
        (object) new PropertyChangedEventArgs(propertyName)
    });
}

所以我可以将Property更改为:

private bool _foo;
public bool Foo
{
    get { _foo; }
    private set
    {
        _foo = value;
        this.OnPropertyChanged();
    }
}

但我想,如果我在使用Property更改时不必实现属性的getter和setter,那就更好了。

现在有人如何将OnPropertyChanged方法作为属性实现,也许是使用AOP?

因此Auto-Property可用于Property Changed,如下所示:

[OnPropertyChanged]
public bool Foo {set;get;}

2 个答案:

答案 0 :(得分:8)

查看FodyPropertyChanged加载项。它将在编译后修改IL,以添加代码以引发属性的PropertyChanged事件。它类似于在Lasse的答案中提到的PostSharp,但它是免费和开源的。

答案 1 :(得分:4)

你需要某种AOP系统才能做到这一点。

您从类中包装或继承的东西,并在包装​​器/后代中动态生成必要的管道来处理此问题,或者在编译后重写代码的某些系统(如Postsharp)。

.NET没有内置任何东西来处理这个问题。