2

所以我有方法:

public Boolean IsItABaseType(object obj)
{
    // How to make sure that this incoming obj
    // is a base type (String, Int32, Double, Int16, Decimal...).
    Boolean isBaseType = obj...
    Console.WriteLine(typeof(obj).Name);
    Console.WriteLIne("obj is base type"+isBaseType);
}

如何确保这个传入的 obj 是基本类型(String、Int32、Double、Int16、Decimal...)?

编辑

作为“基本类型”,我指的是 C# 已知的所有原始类型。

4

6 回答 6

7

运行时中没有“内置”类型的自动列表,因为不同的语言可以对类型有不同的内置支持。

作为“基本类型”,我指的是 C# 已知的所有原始类型。

所以我们可以使用内置类型表(C#参考)来推断:

switch(Type.GetTypeCode(obj.GetType()) {
    case TypeCode.Boolean:
    case TypeCode.Byte:
    case TypeCode.SByte:
    case TypeCode.Char:
    case TypeCode.Decimal:
    case TypeCode.Double:
    case TypeCode.Single:
    case TypeCode.Int32:
    case TypeCode.UInt32:
    case TypeCode.Int64:
    case TypeCode.UInt64:
    case TypeCode.Int16:
    case TypeCode.UInt16:
    case TypeCode.String:
      // do stuff for "built in" types
      ...
      break;
   default:
      // do stuff for all other types
      ...
      break;
}

注意我省略object了,希望是显而易见的原因。

于 2013-03-15T07:43:34.647 回答
3
bool isBaseType = obj is string || obj is int || obj is double || obj is decimal ...;
于 2013-03-15T07:41:20.157 回答
3

似乎每个人都做得很复杂,有很长的条件列表或大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 原始类型以及字符串和十进制

在您的问题中,您在原始类型的定义中包含了StringandDecimal类型。让我们也测试一下,如下所示:

public static bool IsPrimitiveType(Type type)
{
    return type.IsPrimitive
        || type == typeof(decimal)
        || type == typeof(string);
}

由于不可能扩展Stringor Decimal,简单的类型相等在这里就足够了。

3. 内置 C# 类型

如果您对原始类型的定义是 MSDN 上的内置类型表(C# 参考)列表,我们必须排除IntPtrUIntPtr因为它们不在该列表中。

public static bool IsPrimitiveType(Type type)
{
    return (type.IsPrimitive
         && type != typeof(UIntPtr)
         && type != typeof(IntPtr))
        || type == typeof(decimal)
        || type == typeof(string);
}

4. 完全不同的东西

根据前面的示例,您可以了解如何根据需要在基本类型的定义中排除或包含其他类型。


在上述所有示例中,您可以IsPrimitiveType像这样调用该方法:

  1. 如果您有一个对象实例obj

    bool isPrimitive = IsPrimitiveType(obj.GetType());
    
  2. 如果你有一个类型someType

    bool isPrimitive = IsPrimitiveType(someType);
    
  3. 如果你有一个泛型类型参数T

    bool isPrimitive = IsPrimitiveType(typeof(T));
    
  4. 如果您有一个在编译时已知的类型,例如Int32

    bool isPrimitive = IsPrimitiveType(typeof(Int32));
    
于 2013-03-15T10:43:54.510 回答
0

你可以..... if (obj == typeof(double)) blablblabl; if (obj == typeof(int)) blablablaaa2;

希望能帮助你思考

于 2013-03-15T07:43:15.477 回答
0

使用 instanceof 运算符

assert (obj instanceof Integer || obj instanceof Boolean|| obj instanceof String|| obj instanceof Double|| obj instanceof Short|| obj instanceof Long|| obj instanceof Float|| obj instanceof Chracter) : "input is not a valid datatype";

上面的代码会抛出一个断言错误是类型不是原始类型或 null。

于 2013-03-15T07:52:56.403 回答
0

所以我知道该怎么做!

    var t = obj.GetType();
    Boolean isInSystemNameSpace = t.Namespace == "System";
    var result = t == typeof(string) || t.IsValueType && isInSystemNameSpace; 

这会做我想要的。感谢那些试图帮助我的人!

于 2013-03-15T08:12:23.657 回答