2010-01-01 9 views
7

Estoy tratando de escribir un método de extensión que agregará la función HasFactor a la clase int en C#. Esto funciona de maravilla, así:¿Hay alguna manera de escribir un Método de extensión que se aplique a varios tipos?

static class ExtendInt 
{ 
    public static bool HasFactor(this int source, int factor) 
    { 
     return (source % factor == 0); 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     int i = 50; 
     int f = 2; 
     bool b = i.HasFactor(f); 
     Console.WriteLine("Is {0} a factor of {1}? {2}",f,i,b); 
     Console.ReadLine(); 
    } 
} 

Esto funciona muy bien, porque la variable i en el método anterior Main() se declara como un int. Sin embargo, si i se declara como Int16 o Int64, el método de extensión no se muestra a menos que se muestre explícitamente como int o Int32.

Ahora me gustaría aplicar el mismo método HasFactor a Int16 y Int64. Sin embargo, prefiero no escribir métodos de extensión separados para cada tipo de int. I podría escribir un único método para Int64 y luego lanzar explícitamente todo como Int64 o long para que aparezca el método de extensión.

Idealmente, preferiría que el mismo método de extensión se aplicara a los tres tipos sin tener que copiar y pegar una gran cantidad de código.

¿Esto es posible incluso en C#? Si no es así, ¿hay una mejor práctica recomendada para este tipo de situaciones?

+0

Basado en la entrada de Eilon y Marc Gravell, creo que voy a crear un método de extensión para el tipo 'Int64'. Esto debería funcionar para lo que estoy haciendo. –

Respuesta

6

No, esto no es posible en C#. Deberá crear un método de extensión para cada tipo. Lo más cercano es tener un método de extensión que opere en una interfaz, pero en este caso no existe una interfaz INumeric ni nada similar que implementen los diversos tipos numéricos.

+0

En realidad, es posible por algún uso intrincado de Expression Trees (y/o dinámica si estás en .NET 4.0) - Mira la respuesta de Marc Gravel a otra pregunta SO aquí: http://stackoverflow.com/questions/1987136/ should-overloaded-methods-with-value-types-be-consolidated-into-a-generic-method/1987308 # 1987308, y su biblioteca MiscUtil. –

+0

Bueno, los ** operadores ** ('%' etc.) pueden usar esto, pero no el código del método de extensión. Entonces creo (+1) que Eilon tiene la verdad de eso. Creo que hay una cantidad de sobrecargas muy similares en el futuro. –

+0

Eso es interesante. Me interesaría saber si 'dynamic' (o alguna otra característica de .NET 4.0) podría usarse para limitar un método de extensión a tipos específicos. Ha hecho esto? (Tal vez esto debería ser una pregunta SO). –

Cuestiones relacionadas