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

switch条件の長いリストや大きなステートメントを使用して、誰もが非常に複雑なことをしているようです。

プリミティブ型と見なされるものには、複数の可能な解釈があります。

1. .NET プリミティブ型

.NET には、プリミティブ型と見なされる型のリストがあります。Typeクラスには、これらのプリミティブ型およびその他の型に対して返されるプロパティプロパティがありますIsPrimitivetruefalse

プリミティブ型は、Boolean、Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、IntPtr、UIntPtr、Char、Double、および Single です。

IntPtrUIntPtrもそこにあることに注意してください。これらは、プラットフォーム固有の整数型を表します (たとえば、32 ビット コンピュータでは 32 ビット整数、64 ビット コンピュータでは 64 ビット)。また、.NET はプリミティブとは見なされStringないことにも注意してください。Decimal

次のようにテストできます。

public static bool IsPrimitiveType(Type type)
{
    return type.IsPrimitive;
}

2. .NET プリミティブ型と String および Decimal

あなたの質問では、プリミティブ型の定義にStringand型を含めました。Decimal次のように、それらについてもテストしましょう。

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

Stringorを拡張することは不可能なので、Decimalここでは単純な型の等価性で十分です。

3. 組み込みの C# 型

プリミティブ型の定義が MSDN の組み込み型テーブル (C# リファレンス)IntPtrのリストである場合、 andUIntPtrはそのリストにないため、除外する必要があります。

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 に答える
3
bool isBaseType = obj is string || obj is int || obj is double || obj is decimal ...;
于 2013-03-15T07:41:20.157 に答える
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 に答える
0

あなたはできる..... if (obj == typeof(double)) blablblabl; if (obj == typeof(int)) blablablaaa2;

希望はあなたがそれを通して考えるのを助けることができます

于 2013-03-15T07:43:15.477 に答える