当前,我们可以编写检查此代码的代码只是列出所谓的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)在这里没有任何继承关系,编译器似乎在此处进行了一些魔术般的自动广播,以使上述代码有效。
答案 0 :(得分:1)
这是@Marc Gravell建议使用Type.GetTypeCode
提出的一种实现,有趣的是,从sbyte
到uint64
的代码范围是从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
,但同样必须考虑字符串值。
鉴于此,我猜最好的选择是编写一个辅助方法,根据可能的组合进行检查。