web-dev-qa-db-ja.com

オブジェクトタイプが組み込みシステムタイプであるかどうかを確認する方法

シンプルなList<t>からCSVへのコンバーターを書いています。私のコンバーターは、リスト内のすべてのtをチェックし、すべてのパブリックプロパティを取得してCSVに配置します。

いくつかのプロパティを持つ単純なクラスを使用すると、私のコードは(意図したとおりに)うまく機能します。

List<t>からCSVへのコンバーターを取得して、StringやIntegerなどのシステムタイプも受け入れるようにしたいと思います。これらのシステムタイプでは、パブリックプロパティ(Length、Charsなど)を取得したくありません。したがって、オブジェクトがシステムタイプであるかどうかを確認したいと思います。システムタイプとは、string, int32, doubleなどの組み込みの.Netタイプの1つを意味します。

GetType()を使用すると、次のことがわかります。

string myName = "Joe Doe";

bool isPrimitive = myName.GetType().IsPrimitive; // False
bool isSealed = myName.GetType().IsSealed; // True 
// From memory all of the System types are sealed.
bool isValueType = myName.GetType().IsValueType; // False

// LinqPad users: isPrimitive.Dump();isSealed.Dump();isValueType.Dump();

変数myNameが組み込みのシステムタイプであるかどうかを確認するにはどうすればよいですか? (文字列がわからないとします)

41
Jeremy

myName.GetType().Namespace
組み込みタイプの場合、これはシステムを返します。

43
ItsPete

以下にいくつかの可能性のいくつかを示します。

  • myName.GetType().Namespace == "System"
  • myName.GetType().Namespace.StartsWith("System")
  • myName.GetType().Module.ScopeName == "CommonLanguageRuntimeLibrary"
55
Gabe

「システムに組み込まれているタイプ」を正確に定義できない場合、与えられた回答に含まれるタイプがわからない可能性があります。おそらくあなたがしたいことは、あなたがこれをしたくないタイプのリストを持っていることです。さまざまなタイプに対してチェックを行うだけの「IsSimpleType」メソッドがあります。

あなたが探しているかもしれない他のものはプリミティブタイプです。もしそうなら:

Type.IsPrimitive( http://msdn.Microsoft.com/en-us/library/system.type.isprimitive.aspx

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

これには文字列は含まれませんが、手動で追加できます...

参照 タイプがプリミティブかどうかをテストする方法

10
Chris

名前空間ベースのメソッドは、衝突を引き起こす可能性があります。

別の信頼できる簡単な方法があります。

static bool IsSystemType(this Type type) => type.Assembly == typeof(object).Assembly;

または、もう少し最適化して、システムアセンブリをキャッシュします。

static readonly Assembly SystemAssembly = typeof(object).Assembly;

static bool IsSystemType(this Type type) => type.Assembly == SystemAssembly;
8
Makeman

これが最良の可能性だと思います:

private static bool IsBulitinType(Type type)
{
    return (type == typeof(object) || Type.GetTypeCode(type) != TypeCode.Object);
}
6
k3flo

私は反射的に何かを構築していて、IsSecurityCriticalプロパティがこの目的のために機能するように見えたことがわかりました。ただし、これはmyアセンブリの信頼レベルがそのビットを反転させるのに十分な高さではなかったためです。

少し笑った。ありがたいことに私はこの質問を見つけ、それに応じて調整します。

IsSecurityCriticalプロパティは、.NetFramework> 4の場合にのみ存在します

私はおそらく行くでしょう。以前の回答から次のとおりです。

myName.GetType()。Module.ScopeName == "CommonLanguageRuntimeLibrary"

しかし、いくつかの調整が必要です。 Typeの拡張メソッドにしたり、constCommonLanguageRuntimeLibraryに使用したりするなど

3
dasm80x86

既存の回答に関する注意事項を考慮して、Windowsのみのソリューションを提案します。

public static class TypeExt {
    public static bool IsBuiltin(this Type aType) => new[] { "/dotnet/shared/Microsoft", "/windows/Microsoft.net" }.Any(p => aType.Assembly.CodeBase.ToLowerInvariant().Contains(p));
}

おそらく、他のサポートされているオペレーティングシステムにも同様の方法があります。

0
NetMage