2009-07-28 9 views
7

que tiene una línea de código que se parece a esto:simplificación instrucción en C#

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

¿Es posible escribir algo más elegante que esto? Algo así como:

if (obj is byte, int, long) 

Sé que mi ejemplo no es posible, pero ¿hay alguna manera de que este aspecto sea "más limpio"?

+0

Ojalá tu sintaxis estuviera disponible. :-( – Greg

+0

Todo este hackeo solo para hacer que algo se comporte como INumeric –

+0

No es necesariamente solo para tipos numéricos, también necesito comparar con tipos personalizados. –

Respuesta

27

Se puede escribir un método de extensión en el objeto a DOY sintaxis como:

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

Algo como esto (utilizar varias versiones de menos o más argumentos genéricos:

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

¡Es un buen uso de extensiones y genéricos! –

+4

Yo nombraría el método IsOneOf, pero esta es una sintaxis muy concisa. – jeroenh

+0

Bastante listo, +1 de mí –

3

¿Por qué no haces esto?

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

O usted podría ser capaz de salirse con la

obj is IComparable 
+2

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

+0

sólo lo hice rápidamente –

+1

O simplemente: IsRequestedType bool (objeto obj) { retorno obj es el byte || obj es int || obj obj es larga || se decimal obj || || es doble. obj es flotante; } –

8

que lanzaba en un método para simplificar un poco:

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

Me ganaste. Pvoting usted. – NotMe

+0

TY! – jjnguy

1

Eso se ve muy bien a mí - agradable Y limpio.

12

Sólo:

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

... 

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

O utilice obj.GetType().GetTypeCode().

1

Crear una función de ayuda para poner su prueba.

Algo así como

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 
Cuestiones relacionadas