通用方法 - 参数类型转换

时间:2015-08-23 13:30:09

标签: c#

我一直在寻找我的问题解决方案好几个小时没有明确的答案,所以我不得不问这里。 这是我的示例代码:

class Geometry
{
    public static Vector2 quadraticCurvePoint(Vector2 _p1, Vector2 _p2, Vector2 _p3, float _t)
    {
        return (1 - _t) * (1 - _t) * _p1 + 2 * (1 - _t) * _t * _p2 + _t * _t * _p3;
    }

    public static Vector3 quadraticCurvePoint(Vector3 _p1, Vector3 _p2, Vector3 _p3, float _t)
    {
        return (1 - _t) * (1 - _t) * _p1 + 2 * (1 - _t) * _t * _p2 + _t * _t * _p3;
    }

    public static T[] quadraticCurve<T>(T _p1, T _p2, T _p3, uint _q)
    {
        int points_count = (int)_q + 2;
        T[] points = new T[points_count];
        points[0] = _p1;
        points[points_count - 1] = _p3;
        float ti = 1 / points_count;
        float t;
        for (int i = 1; i <= _q; i++)
        {
            t = ti * i;
            points[i] = quadraticCurvePoint(_p1, _p2, _p3, t);
        }
        return points;
    }
}

我想只传递类型Vector2和Vector3,但我不知道如何使这个调用points[i] = quadraticCurvePoint(_p1, _p2, _p3, t);工作因为程序不知道什么类型是_p1 _p2 _p3。

Vector2和Vector3是OpenTK项目的一部分。它们被声明为public struct Vector2 : IEquatable<Vector2>并具有运算符实现。

当然我可以简单地为Vector2和Vector3编写这个方法的重载版本(重复代码),但我不是BADASS程序员风格。

我知道我已经重载了quadraticCurvePoint方法但是它会以与quadraticCurve方法相同的方式进行改进 - 如果可能的话......

1 个答案:

答案 0 :(得分:0)

在C#中使用泛型与在C ++中完全不同,编译器不会试图“猜测”你的意思,你需要明确地告诉它。这是因为在C#中,generics不仅仅是类的模板,而是在编译时指定的。它们是真实的类型。

最好的方法是使用通用参数约束:https://msdn.microsoft.com/library/d5x73970.aspx