【问题标题】:Is it possible to implement Property Changed as Attribute?是否可以将 Property Changed 实现为属性?
【发布时间】:2014-10-01 18:10:39
【问题描述】:

我找到了一个属性更改事件的实现,我可以在其中调用属性更改而无需网络中的属性名称。然后我用它构建了一个扩展方法,就在这里

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)
    });
}

所以我可以这样调用属性更改:

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

但我想,如果我在使用 Property changed 时不必实现 Property 的 getter 和 setter 会更好。

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

这样 Auto-Property 可以用于 Property Changed 像这样:

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

【问题讨论】:

标签: c# wpf inotifypropertychanged


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您将需要某种 AOP 系统来执行此操作。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      相关资源
      最近更新 更多