2009-06-07 11 views
5

Quiero escribir una serie de métodos de extensión para simplificar las operaciones matemáticas. Por ejemplo:¿Cómo escribo correctamente los métodos de extensión matemática para int, double, float, etc.?

En lugar de

Math.Pow(2, 5) 

me gustaría ser capaz de escribir

2.Power(5) 

que es (en mi mente) más clara.

El problema es: ¿cómo trato con los diferentes tipos numéricos al escribir los métodos de extensión? ¿Es necesario escribir un método de extensión para cada tipo:

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); 
} 

O hay un truco para permitir que una sola obra Método de extensión para cualquier tipo numérico?

Gracias!

+3

otro voto para INumeric – Robert

+0

+1 Sí, estoy sorprendido de que no fue parte del marco, para empezar. – Pwninstein

+1

** Advertencia ** al usar tales métodos de extensión: ** '-10.Power (2) == -100' **. El signo menos se aplica al resultado de '10.Power (2)'. – HugoRune

Respuesta

2

Desafortunadamente, creo que estás atascado con las tres implementaciones. La única forma de obtener múltiples métodos de una sola definición es usando genéricos, pero no es posible escribir un método genérico que pueda hacer algo útil específicamente para los tipos numéricos.

0

No creo que sea posible con C# 3.0. Parece que podría ser capaz de hacerlo en C# 4,0

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

+1

Buen punto ... aunque no estoy seguro de que el rendimiento va a valer la pena el precio en el caso general. – jerryjvl

+0

el artikle vinculado no utiliza la dinámica como fue diseñado, la seguridad del tipo de operación para la comodidad no es la manera correcta, creo – Console

0

Usted sólo necesita anular decimal y doble como se indica en esta pregunta: here

0

Una solución que utilizo es hacer que la extensión de objeto. Esto hace que esto sea posible, pero desafortunadamente será visible en todos los objetos.

public static double Power(this object number, double power) 
{ 
    return Math.Pow((double) number, power); 
} 
Cuestiones relacionadas