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 および Decimal
あなたの質問では、プリミティブ型の定義にString
and型を含めました。Decimal
次のように、それらについてもテストしましょう。
public static bool IsPrimitiveType(Type type)
{
return type.IsPrimitive
|| type == typeof(decimal)
|| type == typeof(string);
}
String
orを拡張することは不可能なので、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
上記のすべての例で、次のようにメソッドを呼び出すことができます。
オブジェクト インスタンスがある場合obj
:
bool isPrimitive = IsPrimitiveType(obj.GetType());
タイプがある場合someType
:
bool isPrimitive = IsPrimitiveType(someType);
ジェネリック型パラメーターがある場合T
:
bool isPrimitive = IsPrimitiveType(typeof(T));
コンパイル時に既知の型がある場合、たとえばInt32
:
bool isPrimitive = IsPrimitiveType(typeof(Int32));