在 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 是 Vector2
或 Vector3
以外的任何其他内容,您很可能会得到 NullReferenceException
.
一如既往,当涉及反射时,请分析代码并决定是否值得使用这种方法而不是编写 2 个几乎相同的方法。
我从 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 是 Vector2
或 Vector3
以外的任何其他内容,您很可能会得到 NullReferenceException
.
一如既往,当涉及反射时,请分析代码并决定是否值得使用这种方法而不是编写 2 个几乎相同的方法。