【问题标题】:C# - Implement property observation afterwardsC# - 之后实施属性观察
【发布时间】:2016-09-19 12:37:23
【问题描述】:

我有一个关于观察对象属性的问题。

例如,我有一个这样的类:

public class MyProperties
{
  public string Prop1 { get; set; }
  public int Prop2 { get; set; } 
}

我希望在 MyProperties 的属性之一发生更改时收到通知。我的愿景是这样的:

//I have an instance
MyProperties Prop = new Myproperties();
//And add a listener to the properties
Prop.Prop1.AddNotification(APropertyChanged);
Prop.Prop2.AddNotification(APropertyChanged);

//I have a eventhandler in my code
public void (object Sender, EventArgs e)
{
  //Sender is the Property
}

我不想更改 MyProperties 中的任何代码。有没有办法实现这样的目标.. 还是这个想法完全是白痴?

【问题讨论】:

    标签: c# events notifications observer-pattern observers


    【解决方案1】:

    如果您的 MyProperties 类实现了 INotifyPropertyChanged 接口,您可以引发 PropertyChanged 事件。否则你将不得不查看一些框架(我想面向方面的编程框架会有所帮助)。

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 感谢您的回答。我无法更改班级的代码。所以我不能实现 INotifyPropertyChanged。还有其他方法吗?
      • 最简单的方法是创建一个派生自您的 MyProperty 类并在其上实现 INotifyPropertyChanged 的​​其他类
      【解决方案3】:

      如果你愿意,你可以实现 INotifyPropertyChanged,

      在 WPF MVVM 中常用。

      (你可以自己写一个事件处理程序)

      无论如何.. 我会做这样的事情:

      private string _prop1;
      private int _prop2;
      
      public string Prop1
      {
          get
          {
              return _prop1;
          }
          set
          {
              _prop1 = value;
              RiseEvent(nameof(Prop1),Prop1);
          }
      }
      
      public int Prop2
      {
          get
          {
              return _prop2;
          }
          set
          {
              _prop2 = value;
              RiseEvent(nameof(Prop2),Prop2);
          }
      }
      
      protected void RiseEvent(string propertyName, object propertyValue)
      {
          //---Code that uses the propertyName and propertyValue and rises an event as your choice
      }
      

      nameof() 是 C# 6 中的新语法(VS2015 支持) 如果您使用的是旧版本,您可以通过其他方式执行此操作(评论我,我会分享)

      【讨论】:

      • 感谢您的回答。我无法更改班级的代码。所以我不能实现 INotifyPropertyChanged。还有其他方法吗?
      • 你需要一个类代理,如果你的类有一个属性接口,你可以在 .Net 中使用 RealProxy 类动态地完成它(发现已经有人在谈论它:stackoverflow.com/questions/15733900/…)否则,你可以自己包装你的课程
      【解决方案4】:

      这是我的解决方案。感谢@romain-aga 的提示。

      Fody PropertyChanged 允许在编译期间更改属性的代码。如果我有课:

      public class MyProperties
      {
          public string Prop1 { get; set; }
          ...
      }
      

      Fody 会编译这段代码:

      public class MyProperties
      {
          string prop1;
          public string Prop1
          {
              get { return prop1; }
              set
              {
                  if (value != prop1)
                  {
                      prop1 = value;
                      OnPropertyChanged("Prop1");
                  }
              }
          }
          ...
      }
      

      通过反射,可以为生成的 PropertyChanged 事件添加方法:

      EventInfo Event = typeof(MyProperties).GetEvent("PropertyChanged");
      MethodInfo Method = //The methode of the handler you want
      Delegate Handler = Delegate.CreateDelegate(Event.EventHandlerType, this, Method);
      Event.AddEventHandler(IntanceOfMyProperties, Handler);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-05
        • 2021-03-30
        • 1970-01-01
        • 2012-04-20
        • 2017-04-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        相关资源
        最近更新 更多