C#中类属性创建的抽象

时间:2019-04-30 10:27:00

标签: c#

考虑以下代码:

public class Foo
{
  private float propA = 1.0f;
  public float PropA 
  {
     get { return propA; }
     set { if (value != propA) { propA = value; DoBar(); } }
  }

  private int propB = 2;
  public int PropB 
  {
     get { return propB; }
     set { if (value != propB) { propB = value; DoBar(); } }
  }

  private double propC = -1.0;
  public double PropB 
  {
     get { return propC; }
     set { if (value != propC) { propC = value; DoBar(); } }
  }

  void DoBar() 
  {  
     //...Something is going on here
  }
}

我想知道,是否有人可以推荐一种更好的方法来在C#lang中创建属性? 例如,在C ++中,我将为此目的使用MACRO,因为它不仅使我可以在属性更改时执行某些操作,而且还可以减少样板代码的重复。

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

   public class Foo
   {
      private float propA = 1.0f;
      public float PropA
      {
         get => propA;
         set => CheckAndExecute(ref propA, value);
      }

      private int propB = 2;
      public int PropB
      {
         get => propB;
         set => CheckAndExecute(ref propB, value);
      }

      private double propC = -1.0;
      public double PropC
      {
         get => propC;
         set => CheckAndExecute(ref propC, value);
      }

      private void CheckAndExecute<T>(ref T oldVal, T newVal) where T : IEquatable<T>
      {
         if (((IEquatable<T>) oldVal).Equals(newVal)) return;
         oldVal = newVal;
         DoBar();
      }

      void DoBar()
      {
         //...Something is going on here
      }
   }

您可以通过通用方法重复进行这项工作。