有没有更清洁的方法来检查Type是否为整数?

时间:2019-06-10 15:37:16

标签: c# types

当前,我们可以编写检查此代码的代码只是列出所谓的integral的所有可能类型,如下所示:

public static bool IsIntegral(this Type type)
{
        return type == typeof(int) || type == typeof(uint) ||
               type == typeof(short) || type == typeof(ushort) ||
               type == typeof(long) || type == typeof(ulong) ||
               type == typeof(byte);
}

我想知道是否有更好,更清洁的方法,在转换到字符串或从字符串转换时,不应该涉及任何技巧(我认为效果不佳,即使我们必须使用Activator从Type创建一些虚拟实例)。

可惜的是,这样的事情行不通:

typeof(long).IsAssignableFrom(type);

实际上,在代码中我们可以编写如下代码:

int i = 5;
long l = i;//this looks much like long can be assignable from int

但是实际上它们(long和int)在这里没有任何继承关系,编译器似乎在此处进行了一些魔术般的自动广播,以使上述代码有效。

3 个答案:

答案 0 :(得分:1)

这是@Marc Gravell建议使用Type.GetTypeCode提出的一种实现,有趣的是,从sbyteuint64的代码范围是从5到{ {1}}(如此处https://docs.microsoft.com/en-us/dotnet/api/system.typecode?view=netframework-4.8所述)。因此,假设它们没有更改(实际上应该没有更改),我们可以使用以下更整洁的代码:

12

谢谢你的投票,但我在这里学到了新的东西:D

答案 1 :(得分:0)

不确定是否会更好,但是如果需要的话,似乎更容易更改

private static readonly Type[] integralTypes = new[] { typeof(int), typeof(uint), 
                                                       typeof(short), typeof(ushort),
                                                       typeof(long), typeof(ulong), 
                                                       typeof(byte) };

public static bool IsIntegral(this Type type)
{
    return integralTypes.Contains(type);
}

答案 2 :(得分:-4)

您如何尝试Int64.TryParse(value)成功的转换意味着它是不可或缺的价值。您将不得不排除布尔和字符串。 您也可以使用IsNumber,但同样必须考虑字符串值。

鉴于此,我猜最好的选择是编写一个辅助方法,根据可能的组合进行检查。