2009-07-28 4 views
7

J'ai une ligne de code qui ressemble à ceci:Si la simplification de l'instruction en C#

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

Est-il possible d'écrire quelque chose de plus élégant que cela? Quelque chose comme:

if (obj is byte, int, long) 

Je sais que mon exemple n'est pas possible, mais est-il un moyen de rendre ce look "plus propre"?

+0

Je souhaite que votre syntaxe était disponible. :-( – Greg

+0

Tout ce hackery juste pour obtenir quelque chose à agir comme INumeric –

+0

Ce n'est pas nécessairement juste pour les types numériques, j'ai aussi besoin de comparer avec les types personnalisés –

Répondre

27

Vous pouvez écrire une méthode d'extension sur l'objet pour vous donner une syntaxe du type:

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

Quelque chose comme ceci (utiliser plusieurs versions pour les arguments moins ou plus génériques:

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

C'est une utilisation cool des extensions et des génériques! –

+4

Je nommerais la méthode IsOneOf, mais c'est une syntaxe très concise en effet. – jeroenh

+0

Assez intelligent, +1 de moi –

3

Pourquoi ne faites-vous pas cela?

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

Ou vous pourriez être en mesure de sortir avec

obj is IComparable 
+2

cmon, 'if (true) return true; - Ishy – jjnguy

+0

Je viens de le faire rapidement –

+1

Ou simplement: bool IsRequestedType (objet obj) { return obj est octet || obj est int || obj est long || obj est décimal || obj est double || obj est flottant; } –

8

Je le jeter dans une méthode pour simplifier un peu:

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

Tu m'as battu. vous pvoting. – NotMe

+0

TY! – jjnguy

1

Cela semble bien pour moi - Nice et clair.

12

Seulement:

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

... 

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

Ou utilisez obj.GetType().GetTypeCode().

1

Créer une fonction d'aide pour mettre votre test po

Quelque chose comme

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