如果C#中的语句简化

时间:2009-07-28 14:13:07

标签: c# if-statement

我有一行代码如下:

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)

我知道我的例子是不可能的,但有没有办法让这个看起来更“干净”?

7 个答案:

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

答案 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()

答案 2 :(得分: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);
}

答案 3 :(得分: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

答案 4 :(得分:1)

这对我来说很好 - 很好也很清楚。

答案 5 :(得分: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);
}

答案 6 :(得分: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