Как написать метод расширения для общего типа с ограничениями на параметры типа?

Я работаю с конкретной платформой .NET plattform, которая предварительно скомпилирована, а не OpenSource. Для некоторых задач мне нужно расширить этот класс, но не наследовать его. Я просто хочу добавить метод.

Сначала я хочу показать вам существующий класс dummycode:

public class Matrix<T> where T : new() {
    ...
    public T values[,];
    ...
}

Я хочу расширить этот класс следующим образом:

public static class MatrixExtension {
    public static T getCalcResult<T>(this Matrix<T> mat) {
        T result = 0;
        ...
        return result;
    }
}

У меня есть этот синтаксис со многих ссылок на google, так что не знаю, правильно ли это. Компилятор не сообщает мне об ошибке, но, в конце концов, он не работает. В конце я хочу вызвать эту функцию следующим образом:

Matrix<int> m = new Matrix<int>();
...
int aNumber = m.getCalcResult();

У кого-нибудь появилась идея? Спасибо за помощь!

С уважением Nem

Ответы

Ответ 1

Вам нужно добавить те же ограничения параметров типа для метода расширения.

Это моя попытка скорейшего восстановления вашего примера, который компилируется и запускается без ошибок:

public class Matrix<T>  where T : new() {
     public T[,] values;
 }


 public static class MatrixExtension {
     public static T getCalcResult<T>(this Matrix<T> mat)  where T : new() {
         T result = new T();
         return result;
     }
 }

 class Program {
     static void Main(string[] args)  {
        Matrix<int> m = new Matrix<int>();
        int aNumber = m.getCalcResult();
        Console.WriteLine(aNumber); //outputs "0"
 }

Ответ 2

Прямо сейчас, единственная "ошибка", которую я видел, такова:

T result = 0;

Вы можете изменить это на:

T result = default(T);

В случае типов значений это будет равно нулю, поэтому было бы безопасно.

Однако вы обнаружите, что это трудно, когда вы попадаете в раздел "...", который вы указали. Базовые типы (int, double и т.д.) Не реализуют метод, который вы можете использовать для вычисления вашей математики. Это долгое время, очень проголосовавший запрос на Connect, кстати.

Хотя есть обходные пути, они делают жизнь очень сложной. В отличие от шаблонов на С++, генераторы С# действительно не поддерживают безопасные математические операции типа на произвольных типах.

Ответ 3

Вы заглянули в "Декораторы"...

Пример отображения шаблонов Decorator

Декоратор позволяет вам создать класс со своими собственными свойствами и методами без прямого вывода из одного конкретного класса. Затем вы можете "применить" его практически к любому другому объекту. Затем вы можете применить свои дополнительные методы или свойства, с которыми вы пытаетесь работать.

Этот образец был простой быстрой находкой, показывающей такой пример, прикрепляющийся к "автомобилям" путем создания "опций"...