Подтвердить что ты не робот

Переопределить возвращаемое значение объектов

Я пытаюсь сравнить объект со значением int, например

if (myObject - 5 == 0)
    doSomething();

мой класс может выглядеть примерно так: (большинство сеттеров/геттеров удалены, поэтому не против, чтобы все переменные были частными)

public class SomeClass
{
    public string name;
    private int minValue;
    private int maxValue;
    private int currValue;

    public int getCurrentValue()
    {
        return currValue;
    }
}

То, что я пытаюсь достичь, выглядит примерно так:

someClassInstance - 5;

чтобы быть равным

someClassInstance.getCurrentValue() - 5;

Могу ли я сделать переопределение для того, чтобы объект действовал как int (его собственная переменная), противоположный простому объекту?

4b9b3361

Ответ 1

Может ли быть оператор?

public class SomeClass {
  ...

  public static int operator -(SomeClass left, int right) {
    if (Object.ReferenceEquals(null, left))
      throw new ArgumentNullException("left");

    return left.getCurrentValue() - right;
  }
}

...

SomeClass someClassInstance = new SomeClass(...);

int result = someClassInstance - 5;

Другая возможность (на основе неявного оператора) заключается в том, чтобы преобразовать SomeClass неявно в int при необходимости:

public class SomeClass {
  ...

  // Whenever int is requiered, but SomeClass exists make a conversion
  public static implicit operator int(SomeClass value) {
    if (Object.ReferenceEquals(null, value))
      throw new ArgumentNullException("value");

    return value.getCurrentValue();
  }
}

...

SomeClass someClassInstance = new SomeClass(...);

int result = someClassInstance - 5;

Ответ 2

На самом деле вам было бы намного лучше переопределить operator int, таким образом вы можете делать гораздо больше вычислений с меньшими перегрузками:

using System;

namespace Demo
{
    public class SomeClass
    {
        public string name;
        private int minValue;
        private int maxValue;
        public int currValue;

        public int getCurrentValue()
        {
            return currValue;
        }

        public static implicit operator int(SomeClass value)
        {
            if (value == null)
                throw new ArgumentNullException("value");

            return value.currValue;
        }
    }

    internal class Program
    {
        private void run()
        {
            var test = new SomeClass {currValue = 5};

            if (test - 5 == 0)
                Console.WriteLine("It worked");

            if (test + 5 == 10)
                Console.WriteLine("This also worked");
        }

        private static void Main()
        {
            new Program().run();
        }
    }
}

Ответ 3

Вы можете поэкспериментировать со смесью неявных преобразований и перегрузка оператора, но по моему опыту вы никогда не будете работать так плавно, как хотите (и, как вы могли бы заставить его работать на С++).

Если бы я был вами, я бы изменил getCurrentValue на свойство:

public int CurrentValue
{
    get {return currValue};
}

и просто используйте someClassInstance.CurrentValue -5