我有一行代码如下:
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 :(得分: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