Создание метода, который принимает аргументы Vector2 и Vector3 в C# - PullRequest
1 голос
/ 16 апреля 2020

Я начинаю с C# и испытываю проблемы при написании метода, который принимает аргументы Vector2 и Vector3 в C#.

Generi c, методы выглядели как путь к go, но Я пока не могу заставить это работать. Вот что я попробовал:

static void GetNoisePosition<T>(ref T position, float offset, float scale) where T : IEquatable<T>
{
    position += position.GetType().one * (offset + 0.1f);
    position *= scale;
}

Я действительно не хочу иметь 2 версии GetNoisePosition, каждая из которых принимает векторный тип, так как я не хочу дублировать логи c, и было бы трудно создайте другой метод, который бы разделял некоторые из этих логи c.

Итак, проблема в том, что я хочу вызвать метод one для класса типа T, но он говорит мне, что я могу ' t.

Могу ли я получить доступ к классу через экземпляр position и вызвать его на нем?

1 Ответ

2 голосов
/ 16 апреля 2020

Получение типа вектора и операторные методы с использованием отражения:

public static void CalculateNoisePosition<T>(ref T position, float offset, float scale)
{
  Type vector = position.GetType();
  MethodInfo add = vector.GetMethod("op_Addition", new[] {typeof(T), typeof(T)});
  MethodInfo multiply = vector.GetMethod("op_Multiply", new[] {typeof(T), typeof(float)});

  T one = (T) vector.GetProperty("one").GetValue(null);

  position = (T) add.Invoke(null, new object[] {position, multiply.Invoke(null, new object[] {one, offset + 0.1f})});
  position = (T) multiply.Invoke(null, new object[] {position, scale});
}

Обратите внимание, что если вы вызовете этот метод с T, являющимся чем-то другим, кроме Vector2 или Vector3, вы будете Скорее всего, получите NullReferenceException.

Как всегда, когда есть отражение, пожалуйста, профилируйте код и решите, стоит ли использовать этот подход, а не пишите 2 почти идентичных метода.

...