Как написать метод расширения для общего типа с ограничениями на параметры типа?
Я работаю с конкретной платформой .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
Декоратор позволяет вам создать класс со своими собственными свойствами и методами без прямого вывода из одного конкретного класса. Затем вы можете "применить" его практически к любому другому объекту. Затем вы можете применить свои дополнительные методы или свойства, с которыми вы пытаетесь работать.
Этот образец был простой быстрой находкой, показывающей такой пример, прикрепляющийся к "автомобилям" путем создания "опций"...