Как сделать шаблонный метод для мат операций с числами и Типом Vector2?

Для создания шаблонного метода для математических операций с числами и типом Vector2 в языке программирования C#, можно воспользоваться обобщенными методами и операторами перегрузки.

Вначале создадим структуру Vector2, которая будет представлять двумерный вектор. Например, она может выглядеть следующим образом:

struct Vector2
{
    public float X { get; set; }
    public float Y { get; set; }

    public Vector2(float x, float y)
    {
        X = x;
        Y = y;
    }

    // Методы для выполнения математических операций с векторами
    public static Vector2 operator +(Vector2 a, Vector2 b)
    {
        return new Vector2(a.X + b.X, a.Y + b.Y);
    }

    public static Vector2 operator -(Vector2 a, Vector2 b)
    {
        return new Vector2(a.X - b.X, a.Y - b.Y);
    }
}

Здесь мы определили структуру Vector2 с двумя свойствами X и Y, а также определили операторы + (сложение) и - (вычитание), которые выполняют соответствующие операции над векторами.

Теперь создадим класс MathOperations, в котором будем определять шаблонный метод для выполнения математических операций с числами и векторами:

class MathOperations
{
    // Шаблонный метод для выполнения математических операций
    public static T PerformOperation<T>(T a, T b)
    {
        if (typeof(T) == typeof(Vector2))
        {
            // Приведение типов, чтобы можно было использовать операторы для Vector2
            Vector2 vectorA = (Vector2)(object)a;
            Vector2 vectorB = (Vector2)(object)b;

            Vector2 result = vectorA + vectorB; // Пример операции сложения

            // Приведение типа результата обратно к типу Т
            return (T)(object)result;
        }
        else
        {
            // Если тип не Vector2, выполняет математическую операцию, которая поддерживается
            // данным типом и возвращает результат
            if (typeof(T).IsPrimitive)
            {
                dynamic numA = a;
                dynamic numB = b;

                return numA + numB; // Пример операции сложения с числами
            }
            else
            {
                throw new ArgumentException("Unsupported type");
            }
        }
    }
}

В методе PerformOperation мы используем проверку типа, чтобы определить, является ли переданный тип T типом Vector2. Если это так, то выполняем соответствующую операцию над векторами (например, сложение).

Для прочих типов мы выполняем проверку, является ли тип T примитивным, и если да, то выполняем соответствующую математическую операцию (например, сложение чисел). В противном случае, выбрасываем исключение, указывая на то, что данный тип не поддерживается.

Для использования шаблонного метода MathOperations.PerformOperation, можно написать следующий код:

float num1 = 2.5f;
float num2 = 1.5f;
float result1 = MathOperations.PerformOperation(num1, num2);
Console.WriteLine("Результат сложения чисел: " + result1);

Vector2 vector1 = new Vector2(1.0f, 2.0f);
Vector2 vector2 = new Vector2(3.0f, 4.0f);
Vector2 result2 = MathOperations.PerformOperation(vector1, vector2);
Console.WriteLine("Результат сложения векторов: " + result2.X + ", " + result2.Y);

В этом примере мы передаем в метод PerformOperation как числа (float) для выполнения операции сложения, так и векторы (Vector2). Метод будет корректно обрабатывать каждый тип данных и выполнять соответствующую операцию.

В результате, метод PerformOperation вернет результат операции, который можно вывести на экран с помощью метода Console.WriteLine. Если операция не поддерживается для переданного типа, будет выброшено исключение.