2012-06-26 8 views
7

Digamos que me gustaría agregar un método de extensión llamado IsOdd() a los tipos de datos numéricos en .NET. La implementación de esto, sin embargo, será prácticamente la misma para los tipos de datos como Int16, Int32, Int64, etc., excepto por el parámetro que se define para el método de extensión. Realmente no me gusta esta redundancia, pero me pregunto si no hay forma de evitarla.¿Evitar los métodos de extensión .NET para tipos de datos numéricos?

¿Hay una mejor manera de manejar esto? ¿Debo, por ejemplo, implementar un método de extensión para System.Math y crear definiciones sobrecargadas para IsOdd()? En resumen, tengo curiosidad por saber si los métodos de extensión para los tipos de datos numéricos generalmente deberían evitarse por completo, debido a su redundancia inherente.

+1

Bueno, yo evitaría poner un método de extensión de esos tipos, simplemente porque se utilizan tan comúnmente, una que no se necesitaría 'IsOdd' muy a menudo. Sería abarrotarlos. – Servy

+2

... para agregar al comentario de @Servy, generalmente se considera una mala práctica agregar métodos de extensión a tipos muy generales como struct & object. En su lugar, simplemente cree una clase estática y realice una prueba con 'MyMath.IsOdd (x)' –

Respuesta

7

No puede crear un método de extensión para una clase estática. Lo más cerca que se puede hacer, es la siguiente:

public static bool IsOdd<T>(this T number) where T : struct 

Esto restringirá el método de extensión a los tipos de valor. Sin embargo, todavía obtendrá algunas cosas que no puede tratar (por ejemplo, DateTime). Tendrás que lanzar una excepción en este caso.

Editar: Como dijo Mangist en los comentarios, puede hacer lo siguiente para limitar aún más el método:

public static bool IsOdd<T>(this T number) 
    where T : struct, IComparable, IComparable<T>, 
       IConvertible, IEquatable<T>, IFormattable 
+1

. Por lo tanto, desea ordenar Intellisense para cada estructura cargada en su ensamblaje. Parece que es más problemático de lo que vale en ese punto. – Servy

+5

Puede restringir hacia abajo aún más mediante la adición de donde T: struct, IComparable, IComparable , IConvertible, IEquatable , IFormattable – Mangist

+0

Muy buena, Mangist. – GregRos

0

Siempre se puede combinar Generics con los métodos de extensión para evitar duplicaciones, al igual que en el caso de que mencionado. por ejemplo

IsOdd<Type>()

Cuestiones relacionadas