Как правильно написать методы расширения Math для int, double, float и т. Д.? - PullRequest
5 голосов
/ 07 июня 2009

Я хочу написать серию методов Extension для упрощения математических операций. Например:

Вместо

Math.Pow(2, 5)

Я бы хотел написать

2.Power(5) 

что (на мой взгляд) яснее.

Проблема в том, как мне обращаться с различными числовыми типами при написании методов расширения? Нужно ли мне писать метод расширения для каждого типа:

public static double Power(this double number, double power) {
    return Math.Pow(number, power);
}
public static double Power(this int number, double power) {
    return Math.Pow(number, power);
}
public static double Power(this float number, double power) {
    return Math.Pow(number, power);
}

Или есть способ, позволяющий одному методу расширения работать для любого числового типа?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 07 июня 2009

К сожалению, я думаю, что вы застряли с тремя реализациями. Единственный способ получить множественные типизированные методы из одного определения - использовать обобщенные, но невозможно написать обобщенный метод, который может сделать что-то полезное специально для числовых типов.

1 голос
/ 29 сентября 2017

Одним из решений, которое я использую, является создание расширения для объекта. Это делает это возможным, но, к сожалению, оно будет видно на всех объектах.

public static double Power(this object number, double power) 
{
    return Math.Pow((double) number, power);
}
0 голосов
/ 16 сентября 2010

Вам нужно только переопределить Десятичные и Двойные, как указано в этом вопросе: здесь

0 голосов
/ 07 июня 2009

Я не думаю, что это возможно с C # 3.0. Похоже, вы могли бы сделать это C # 4.0

http://blogs.msdn.com/lucabol/archive/2009/02/05/simulating-inumeric-with-dynamic-in-c-4-0.aspx

...