2010-01-01 14 views
7

Ich versuche, eine Erweiterungsmethode zu schreiben, die die Funktion HasFactor der Klasse int in C# hinzufügen wird. Das funktioniert wunderbar, etwa so:Gibt es eine Möglichkeit, eine Erweiterungsmethode zu schreiben, die für mehrere Typen gilt?

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

Dies funktioniert gut, weil variable i im Main() Verfahren oben als int deklariert wird. Wenn jedoch i als Int16 oder Int64 deklariert wird, wird die Erweiterungsmethode nur angezeigt, wenn sie explizit als int oder Int32 umgewandelt wurde.

Ich möchte jetzt die gleiche HasFactor Methode auf Int16 und Int64 anwenden. Ich würde jedoch lieber keine separaten Erweiterungsmethoden für jeden Typ von int schreiben. I könnte schreiben Sie eine einzige Methode für Int64 und dann explizit alles als Int64 oder long zu werfen, damit die Erweiterungsmethode angezeigt wird.

Idealerweise würde ich bevorzugen, dass die gleiche Erweiterungsmethode für alle drei Typen gilt, ohne viel Code kopieren und einfügen zu müssen.

Ist das in C# überhaupt möglich? Wenn nicht, gibt es eine empfohlene Best Practice für diese Art von Situation?

+0

Basierend auf den Eingaben von Eilon und Marc Gravell, denke ich, dass ich eine Erweiterungsmethode für den Typ 'Int64' erstellen werde. Das sollte für das funktionieren, was ich mache. –

Antwort

6

Nein, dies ist in C# nicht möglich. Sie müssen für jeden Typ eine Erweiterungsmethode erstellen. Am nächsten kommt eine Erweiterungsmethode, die auf einer Schnittstelle funktioniert, aber in diesem Fall gibt es keine INumeric-Schnittstelle oder etwas Ähnliches, das von den verschiedenen numerischen Typen implementiert wird.

+0

Tatsächlich ist es möglich durch einige komplizierte Verwendung von Expression Trees (und/oder Dynamik, wenn Sie in .NET 4.0 sind) - Check Marc Gravel die Antwort auf eine andere SO Frage hier: http://StackOverflow.com/Questions/1987136/ Überladen-Methoden-mit-Wert-Typen-konsolidiert-in-eine-generische-Methode/1987308 # 1987308, und seine MiscUtil-Bibliothek. –

+0

Nun, die ** Operatoren ** ('%' etc) können dies verwenden - aber nicht den Code der Erweiterungsmethode. Also denke ich (+1), dass Eilon die Wahrheit davon hat. Eine Reihe sehr ähnlicher Überlastungen sind in der Zukunft, vermute ich. –

+0

Das ist interessant. Es wäre interessant zu wissen, ob 'dynamic' (oder eine andere .NET 4.0-Funktion) verwendet werden könnte, um eine Erweiterungsmethode auf bestimmte Typen zu beschränken. Ist das gemacht worden? (Vielleicht sollte das eine separate Frage sein). –

Verwandte Themen