2009-07-28 3 views
7

中の文の簡素化が、私はこのようなコードの行がある場合:C#の

if (obj is byte || obj is int || obj is long || obj is decimal || obj is double || obj is float) 

それはこれ以上エレガントな何かを書くことは可能ですか?次のようなものがあります:

if (obj is byte, int, long) 

私の例は不可能ですが、この見た目を「よりクリーン」にする方法はありますか?

+0

構文が利用可能であることを希望します。 :-( – Greg

+0

このすべてのハッカーは、INUMericのように動作するようにするだけです –

+0

数値型のためだけでなく、カスタム型とも比較する必要があります。 –

答えて

27

あなたが好きなの構文与えるために、オブジェクト上の拡張メソッドを書くことができる:この(より少ない、またはより一般的な引数のための複数のバージョンを使用するような何か

if (obj.Is<byte, int, long>()) { ... } 

public static bool Is<T1, T2, T3>(this object o) 
{ 
    return o is T1 || o is T2 || o is T3; 
} 
+0

それは拡張機能とジェネリックのクールな使い方です! –

+4

私はIsOneOfメソッドの名前を付けますが、これは実際には非常に簡潔な構文です。 – jeroenh

+0

賢い、+1私から –

3

どうすればよろしいですか?

bool IsRequestedType(object obj) 
{ 
    if (obj is byte || obj is int || obj is long || obj is decimal || obj is double || obj is float) 
     return true; 
    return false; 
} 

それとも、それを少し簡単にするために

obj is IComparable 
+2

cmon、 'if(true)return true; else false false;' - Ishy – jjnguy

+0

私はちょうど –

+1

それとも単に迅速にそれをやった:。。 ブールIsRequestedType(オブジェクトobj) { 戻りobjがバイト|| OBJ IS int型|| OBJ長い||のOBJですが、小数点||のobjが二重である|| objは浮動小数点であり; } –

8

私はメソッドにそれを投げるだろうと逃げることができるかもしれません:

private static bool ObjIsNumber(object obj) 
{ 
    return (obj is byte || obj is int || obj is long || 
      obj is decimal || obj is double || obj is float); 
} 
+0

あなたはそれに私を打つ。あなたに投票する。 – NotMe

+0

TY! – jjnguy

1

私には正常に見える - 素敵な明らかである。

12

のみ:

static readonly HashSet<Type> types = new HashSet<Type> 
    { typeof(byte), typeof(int), typeof(long) etc }; 

... 

if (types.Contains(obj.GetType()) 
{ 
} 

またはobj.GetType().GetTypeCode()を使用しています。

1

は、ヘルパー関数を作成します。あなたのテストを入れてください。

何かのように

public static Boolean IsNumeric(Object myObject) { 
    return (obj is byte || obj is int || obj is long || obj is decimal || obj is double|| obj is float); 
} 
1
public static bool IsOneOf(object o, params Type[] types) 
{ 
    foreach(Type t in types) 
    { 
     if(o.GetType() == t) return true; 
    } 

    return false; 
} 

long l = 10; 
double d = 10; 
string s = "blah"; 

Console.WriteLine(IsOneOf(l, typeof(long), typeof(double))); // true 
Console.WriteLine(IsOneOf(d, typeof(long), typeof(double))); // true 
Console.WriteLine(IsOneOf(s, typeof(long), typeof(double))); // false