2010-01-01 3 views
7

Sto provando a scrivere un metodo di estensione che aggiungerà la funzione HasFactor alla classe int in C#. Questo funziona meravigliosamente, in questo modo:C'è un modo per scrivere un metodo di estensione che si applica a più tipi?

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

Questa grande opera, perché variabile i nel metodo Main() sopra è dichiarato come un int. Tuttavia, se i viene dichiarato come Int16 o , il metodo di estensione non viene visualizzato a meno che non sia espressamente castato come int o Int32.

ora mi piacerebbe applicare lo stesso metodo HasFactor-Int16 e Int64. Tuttavia, preferirei non scrivere metodi di estensione separati per ciascun tipo di int. I potrebbe scrivere un unico metodo per Int64 e quindi trasmettere espressamente tutto come Int64 o long in modo che il metodo di estensione venga visualizzato.

Idealmente, preferirei applicare lo stesso metodo di estensione a tutti e tre i tipi senza dover copiare e incollare molto codice.

Ciò è possibile anche in C#? In caso contrario, esiste una procedura consigliata per questo tipo di situazione?

+0

Sulla base degli input di Eilon e Marc Gravell, penso che creerò un metodo di estensione per tipo "Int64". Questo dovrebbe funzionare per quello che sto facendo. –

risposta

6

No, questo non è possibile in C#. Dovrai creare un metodo di estensione per ciascun tipo. Il più vicino è avere un metodo di estensione che opera su un'interfaccia, ma in questo caso non c'è un'interfaccia inumerica o qualcosa di simile che sia implementata dai vari tipi numerici.

+0

In realtà è possibile tramite l'uso convuluto di Expression Trees (e/o dynamics se si è in .NET 4.0). Consulta la risposta di Marc Gravel a un'altra domanda SO qui: http://stackoverflow.com/questions/1987136/ dovrebbe-overloaded-metodi-con-valore-tipi-essere-consolidato-in-un-metodo-generico/1987308 # 1987308, e la sua libreria MiscUtil. –

+0

Bene, gli ** operatori ** ('%' etc) possono usare questo - ma non il codice del metodo di estensione. Quindi penso (+1) che Eilon abbia la verità. Un certo numero di sovraccarichi molto simili sono in futuro, sospetto. –

+0

È interessante. Sarei interessato a sapere se 'dynamic' (o qualche altra caratteristica di .NET 4.0) potrebbe essere usato per limitare un metodo di estensione a tipi specifici. È stato fatto? (Forse questa dovrebbe essere una domanda SO separata). –