在 C# 中创建一个接受 Vector2 和 Vector3 参数的方法

Creating a method that accepts both Vector2 and Vector3 arguments in C#

我从 C# 开始,在编写接受 C# 中的 Vector2 和 Vector3 参数的方法时遇到问题。

通用方法看起来是可行的方法,但我现在还不能让它工作。这是我尝试过的:

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,每个版本都采用矢量类型,因为我不想重复逻辑,而且很难创建另一种方法来共享其中的一些逻辑。

所以,问题是我想在类型 T 的 class 上调用 one 方法,但它告诉我不能。

我可以通过 position 实例访问 class 并调用它吗?

获取向量的类型,以及使用反射的运算符方法:

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 是 Vector2Vector3 以外的任何其他内容,您很可能会得到 NullReferenceException.

一如既往,当涉及反射时,请分析代码并决定是否值得使用这种方法而不是编写 2 个几乎相同的方法。