2009-06-07 9 views
5

Je veux écrire une série de méthodes d'extension pour simplifier les opérations mathématiques. Par exemple:Comment écrire correctement les méthodes d'extension Math pour int, double, float, etc.?

Au lieu de

Math.Pow(2, 5) 

Je voudrais pouvoir écrire

2.Power(5) 

qui est (dans mon esprit) plus clair.

Le problème est: comment traiter les différents types numériques lors de l'écriture de méthodes d'extension? Ai-je besoin d'écrire une méthode d'extension pour chaque type:

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

Ou est-il une astuce pour permettre un travail Méthode d'extension pour tout type numérique?

Merci!

+3

un autre vote pour INumeric – Robert

+0

+1 Oui, je suis surpris que cela ne faisait pas partie du cadre pour commencer. – Pwninstein

+1

** Avertissement ** lors de l'utilisation de ces méthodes d'extension: ** '-10.Power (2) == -100' **. Le signe moins est appliqué au résultat de '10.Power (2)'. – HugoRune

Répondre

2

Malheureusement je pense que vous êtes coincé avec les trois implémentations. La seule façon d'obtenir plusieurs méthodes typées à partir d'une seule définition est d'utiliser des génériques, mais il n'est pas possible d'écrire une méthode générique qui peut faire quelque chose d'utile spécifiquement pour les types numériques.

0

Je ne pense pas que ce soit possible avec C# 3.0. On dirait que vous pourriez être en mesure de le faire C# 4,0

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

+1

Bon point ... Je ne suis pas sûr que le coup de performance va valoir le prix dans le cas général cependant. – jerryjvl

+0

l'artikle lié n'utilise pas dynamique comme il a été conçu, la sécurité du type de négociation pour le confort n'est pas la bonne façon dont je pense – Console

0

Il vous suffit de remplacer décimal et double comme il est indiqué dans cette question: here

0

Une solution que j'utilise est de faire l'extension sur objet. Cela rend cela possible, mais malheureusement, il sera visible sur tous les objets.

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