シンプルな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が組み込みのシステムタイプであるかどうかを確認するにはどうすればよいですか? (文字列がわからないとします)
myName.GetType().Namespace
組み込みタイプの場合、これはシステムを返します。
以下にいくつかの可能性のいくつかを示します。
myName.GetType().Namespace == "System"
myName.GetType().Namespace.StartsWith("System")
myName.GetType().Module.ScopeName == "CommonLanguageRuntimeLibrary"
「システムに組み込まれているタイプ」を正確に定義できない場合、与えられた回答に含まれるタイプがわからない可能性があります。おそらくあなたがしたいことは、あなたがこれをしたくないタイプのリストを持っていることです。さまざまなタイプに対してチェックを行うだけの「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です。
これには文字列は含まれませんが、手動で追加できます...
名前空間ベースのメソッドは、衝突を引き起こす可能性があります。
別の信頼できる簡単な方法があります。
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;
これが最良の可能性だと思います:
private static bool IsBulitinType(Type type)
{
return (type == typeof(object) || Type.GetTypeCode(type) != TypeCode.Object);
}
私は反射的に何かを構築していて、IsSecurityCritical
プロパティがこの目的のために機能するように見えたことがわかりました。ただし、これはmyアセンブリの信頼レベルがそのビットを反転させるのに十分な高さではなかったためです。
少し笑った。ありがたいことに私はこの質問を見つけ、それに応じて調整します。
注:IsSecurityCritical
プロパティは、.NetFramework> 4の場合にのみ存在します
私はおそらく行くでしょう。以前の回答から次のとおりです。
myName.GetType()。Module.ScopeName == "CommonLanguageRuntimeLibrary"
しかし、いくつかの調整が必要です。 Type
の拡張メソッドにしたり、const
をCommonLanguageRuntimeLibraryに使用したりするなど
既存の回答に関する注意事項を考慮して、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));
}
おそらく、他のサポートされているオペレーティングシステムにも同様の方法があります。