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 return false;' - Ishy. – jjnguy

+0

Я просто сделал это быстро. –

+1

Или просто: bool IsRequestedType (объект obj) { {obj is byte || obj is int || obj is long || obj is float, } –

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 
Смежные вопросы