2012-06-26 6 views
7

という拡張メソッドを.NETの数値データ型にIsOdd()という形で追加したいとします。しかし、これの実装は、拡張メソッド用に定義されているパラメータを除いて、Int16,Int32,Int64などのデータ型では事実上同じになります。私は本当にこの冗長性が嫌いですが、それを避ける方法がないのだろうかと思っています。数値データ型の.NET拡張メソッドを使用しないでください。

これを処理するより良い方法はありますか?代わりに、System.Mathの拡張メソッドを実装し、オーバーロードされた定義を作成する必要があります。IsOdd()?要するに、数値データ型の拡張メソッドが、それらの固有の冗長性のために、一般的に避けられるべきなのかどうか不思議です。

+1

まあ、私は彼らがそのように一般的に使用されているという理由だけで、それらの種類に拡張メソッドを置かないと思い、私はすべてのことが多い 'IsOdd'を必要としません。それはそれらを混乱させるだろう。 – Servy

+2

... @ Servyのコメントに追加するには、構造体とオブジェクトのような非常に一般的な型に拡張メソッドを追加することは、一般に悪い習慣とみなされます。代わりに静的なクラスを作成し、 'MyMath.IsOdd(x)'でテストしてください –

答えて

7

静的クラスの拡張メソッドを作成することはできません。 あなたがすることができる最も近い、次のようである:

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

これは、値型へ拡張メソッドが制限されます。 しかし、対処できないものもあります(例:DateTime)。この場合、例外をスローする必要があります。

編集: Mangistはコメントで言ったように、あなたは別の方法を制限するために次の操作を行うことができます。

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

アセンブリにロードされたすべての単一の構造体に対してintellisenseを混乱させたいとします。その時点でそれが価値があるよりもトラブルが多いように思えます。構造体、 IComparableを、 IComparableを、 IConvertible、 IEquatable 、 IFormattable – Servy

+5

あなたはここで、Tを追加することで、さらにそれを制約することができます。 – Mangist

+0

良い1、Mangist: – GregRos

0

あなたは常に場合と同様に、重複を避けるために、拡張メソッドでGenericsを組み合わせることができますと述べた。例えば

IsOdd<Type>()

関連する問題