似乎每个人都做得很复杂,有很长的条件列表或大switch
语句。
您认为的原始类型有多种可能的解释。
1. .NET 原始类型
.NET 有一个它认为是原始类型的类型列表。在Type
类上,有一个属性IsPrimitive
属性将为true
任何这些原始类型和false
任何其他类型返回。
基本类型是 Boolean、Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、IntPtr、UIntPtr、Char、Double 和 Single。
请注意,IntPtr
并且UIntPtr
也在那里。它们代表特定于平台的整数类型(例如,32 位计算机上的 32 位整数,64 位计算机上的 64 位)。另请注意,.NET 不考虑String
也不Decimal
是原语。
你可以像这样测试它:
public static bool IsPrimitiveType(Type type)
{
return type.IsPrimitive;
}
2. .NET 原始类型以及字符串和十进制
在您的问题中,您在原始类型的定义中包含了String
andDecimal
类型。让我们也测试一下,如下所示:
public static bool IsPrimitiveType(Type type)
{
return type.IsPrimitive
|| type == typeof(decimal)
|| type == typeof(string);
}
由于不可能扩展String
or Decimal
,简单的类型相等在这里就足够了。
3. 内置 C# 类型
如果您对原始类型的定义是 MSDN 上的内置类型表(C# 参考)列表,我们必须排除IntPtr
,UIntPtr
因为它们不在该列表中。
public static bool IsPrimitiveType(Type type)
{
return (type.IsPrimitive
&& type != typeof(UIntPtr)
&& type != typeof(IntPtr))
|| type == typeof(decimal)
|| type == typeof(string);
}
4. 完全不同的东西
根据前面的示例,您可以了解如何根据需要在基本类型的定义中排除或包含其他类型。
在上述所有示例中,您可以IsPrimitiveType
像这样调用该方法:
如果您有一个对象实例obj
:
bool isPrimitive = IsPrimitiveType(obj.GetType());
如果你有一个类型someType
:
bool isPrimitive = IsPrimitiveType(someType);
如果你有一个泛型类型参数T
:
bool isPrimitive = IsPrimitiveType(typeof(T));
如果您有一个在编译时已知的类型,例如Int32
:
bool isPrimitive = IsPrimitiveType(typeof(Int32));