Я создал кодовую базу, в которой сильно полагаюсь на структуру float
.Но поплавок может означать что угодно.Секунды, метры, радианы, килограммы, метры в секунду, радианы в секунду и т. Д. Правильное именование помогает, но все равно легко все перемешать.Поэтому я начал писать структуры, которые обертывают поплавки, для каждой единицы.Но становится все труднее писать структуры, которые:
- хранят базовое значение с плавающей запятой
- всех их операторов (<, <=,>,> =, ==,! =,-, +, *, /)
- правильный метод Equals, GetHashCode и ToString
- Реализация интерфейса IEquatable
Какой самый простой способгенерировать такие структуры, чтобы мне не пришлось поддерживать так много кода?
Бонусные вопросы: Таким образом, я все еще могу добавить некоторые специальные операторы.Например, я хотел бы добавить оператор, который превращает Meters
/ Seconds
в MetersPerSecond
.
Редактировать: я нахожусь на .Net Framework 4.7 и уровне языка C # 7.3
Вот мой пример Seconds
struct.Как вы можете себе представить, структура Meters выглядит точно так же.
public struct Seconds : IEquatable<Seconds>
{
public Seconds(float value)
{
this.Value = value;
}
public float Value { get; }
public static implicit operator Seconds(float value) => new Seconds(value);
public static implicit operator Seconds(TimeSpan value) => new Seconds((float)value.TotalSeconds);
public static Seconds operator +(Seconds a, Seconds b) => new Seconds(a.Value + b.Value);
public static Seconds operator -(Seconds a, Seconds b) => new Seconds(a.Value - b.Value);
public static bool operator >(Seconds a, Seconds b) => a.Value > b.Value;
public static bool operator <(Seconds a, Seconds b) => a.Value < b.Value;
public static bool operator >=(Seconds a, Seconds b) => a.Value >= b.Value;
public static bool operator <=(Seconds a, Seconds b) => a.Value <= b.Value;
public static bool operator ==(Seconds a, Seconds b) => a.Equals(b);
public static bool operator !=(Seconds a, Seconds b) => !a.Equals(b);
public override int GetHashCode() => this.Value.GetHashCode();
public override bool Equals(object obj)
{
if (obj is Seconds)
{
return this.Equals((Seconds)obj);
}
return false;
}
public bool Equals(Seconds other) => other.Value == this.Value;
public override string ToString() => $"{this.Value.ToString("F2", CultureInfo.InvariantCulture)}s";
}