2012-06-26 6 views
7

Angenommen, ich möchte eine Erweiterungs-Methode namens IsOdd() zu den Zahl-Datentypen in .NET hinzufügen. Die Implementierung davon wird jedoch für die Datentypen wie Int16, Int32, Int64, usw., mit Ausnahme des Parameters, der für die Erweiterungsmethode definiert wird, praktisch gleich sein. Ich mag diese Redundanz wirklich nicht, frage mich aber, ob es nicht möglich ist, sie zu vermeiden.Vermeiden Sie .NET-Erweiterungsmethoden für Zahlendatentypen?

Gibt es einen besseren Weg, damit umzugehen? Soll ich stattdessen eine Erweiterungsmethode für System.Math implementieren und überladene Definitionen für IsOdd() erstellen? Kurz gesagt, ich bin gespannt, ob Erweiterungsmethoden für die Zahlendatentypen aufgrund ihrer inhärenten Redundanz generell vermieden werden sollten.

+1

Nun, würde ich eine Erweiterungsmethode auf diesen Typen einfach, weil sie so häufig verwendet werden, vermeiden, dass ein würde ich nicht brauchen 'IsOdd' alles, was oft. Es würde sie verstopfen. – Servy

+2

... Um @ Servys Kommentar hinzuzufügen, wird es allgemein als schlechte Praxis angesehen, Erweiterungsmethoden zu sehr allgemeinen Typen wie struct & object hinzuzufügen. Erstellen Sie stattdessen einfach eine statische Klasse und testen Sie mit 'MyMath.IsOdd (x)' –

Antwort

7

Sie können keine Erweiterungsmethode für eine statische Klasse erstellen. Die nächstgelegene Sie tun können, ist die folgende:

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

Dies wird die Erweiterungsmethode Werttypen beschränken. Sie werden jedoch immer noch einige Sachen erhalten, mit denen Sie nicht umgehen können (z. B. DateTime zum Beispiel). In diesem Fall müssen Sie eine Ausnahme auslösen.

Edit: Wie Mangist in den Kommentaren gesagt, können Sie die folgenden weiter einschränken, das Verfahren tun:

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

. Sie möchten also intellisense für jede einzelne in Ihrer Assembly geladene Struktur durcheinander bringen. Klingt, als wäre es mehr Mühe, als es an diesem Punkt wert ist. – Servy

+5

Sie können es weiter einschränken nach unten durch Zugabe von wo T: struct, IComparable, IComparable , IConvertible, IEquatable , IFormattable – Mangist

+0

Der war gut, Mangist. – GregRos

0

Sie immer Generics mit Erweiterungsmethoden kombinieren können Doppelspurigkeiten zu vermeiden, wie Sie im Fall erwähnt. z

IsOdd<Type>()

Verwandte Themen