当ref返回属性的基础值发生更改时调用方法

时间:2019-02-13 04:57:55

标签: c# c#-7.0

考虑以下代码:

public struct Vector2
{
   public float X;
   public float Y;
}

public class Sprite
{
   private Vector2 position;
   public ref Vector2 Position => ref position;

   private void DoStuffWhenPositionChanges() { /*...code...*/ }
}

ref return允许我执行以下设置操作:

someSprite.Position.X++;
someSprite.Position.Y = 42;

无论何时设置DoStuffWhenPositionChanges结构的XY组件,我都想调用Position。请注意,Vector2是库级别的结构,不能在我的代码中更改。

我正在寻找与以下类似的解决方案:

public class Sprite
{
   private Vector2 position;
   public Vector2 Position
   {
      get => position;  //ref return not possible!
      set
      {
         position = value;
         DoStuffWhenPositionChanges();
      }
   }

   private void DoStuffWhenPositionChanges() { /*...code...*/ }
}

...但使用ref return,以避免在调用代码中执行以下操作:

someSprite.Position = new Vector2(someSprite.Position.X, someSprite.Position.Y + 1);

我已经考虑过INotifyPropertyChanged,但是由于我无法修改库级别的Vector2结构,因此我需要一个替代解决方案。我还考虑了一种可以隐式转换为Vector2的代理类型,该代理类型可以实现INotifyPropertyChanged,但似乎……很麻烦;也许有一个我不知道的更干净的解决方案。

通过上述设置,是否可以知道ref return属性的基础值何时更改?

2 个答案:

答案 0 :(得分:0)

一种方法是为Struct创建包装器,然后实现RaisePropertyChanged方法或INotifyPropertyChanged

public struct Vector2
{
   public float X;
   public float Y;
}

public class VectorWrapper
{
   private Vector2 thing;
   public var X 
   {
        get { return thing.X; }
        set { thing.X = value; RaisePropertyChanged(SomePropertyName); }
   }
   public var Y 
   {
        get { return thing.Y; }
        set { thing.Y = value; RaisePropertyChanged(SomePropertyName); }
   }
}

答案 1 :(得分:0)

有点hack,但这可以完成工作。

static void Main(string[] args)
{
    var s = new Sprite();
    s.DoStuffWhenPositionChanges(s.Position.X++);

}

public struct Vector2
{
    public float X;
    public float Y;
}

public class Sprite
{
    private Vector2 position;

    public ref Vector2 Position => ref position;

    public void DoStuffWhenPositionChanges(float f = default)
    {

    }
}