Вызвать метод, когда изменяется базовое значение ref, возвращающего свойство - PullRequest
0 голосов
/ 13 февраля 2019

Рассмотрим следующий код:

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 всякий раз, когда либоX или Y компоненты структуры 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 голосов
/ 13 февраля 2019

Это что-то вроде хака, но это сделает работу.

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)
    {

    }
}
0 голосов
/ 13 февраля 2019

Один из способов - создать оболочку для 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); }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...