Comment faire pour déterminer si un type d'objet est un construit dans le système de type
Je suis en train d'écrire un simple List<t>
CSV converter. Mon convertisseur vérifie tous les t
's dans la Liste et s'empare de toutes les propriétés publiques et les place dans le fichier CSV.
Mon code fonctionne très bien (comme prévu) lorsque vous utilisez une classe simple avec un peu de propriétés.
Je voudrais obtenir le List<t>
CSV de convertisseur à accepter aussi le Système de types tels que String et Integer. Avec ces types de système, je ne veux pas obtenir leurs propriétés publiques (telles que la Longueur, Caractères, etc). Donc je voudrais vérifier si l'objet est un type de Système. Par type de Système, je veux dire celle du construit en .Types de réseau tels que string, int32, double
etc.
À l'aide de GetType() je peux trouver de la manière suivante:
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();
Comment puis-je savoir si la variable monnom est construit dans le type de Système? (en supposant que nous ne savons pas ses une chaîne de caractères)
- Que considérez-vous comme un type de système et ce n'est pas?
- Je ne connais pas la terminologie correcte, mais je considère
string
,int32
à un type de système etEmployee
n'est évidemment pas. Fondamentalement, n'importe quel type qui n'a pas été créé par le compilateur. - Vous recherchez uniquement des types intégrée dans le compilateur? Ou tous les types de l'
System
espace de noms? - ohh je vois où vous allez, il suffit de comparer l'espace de noms racine "Système"?
Vous devez vous connecter pour publier un commentaire.
myName.GetType().Namespace
Ce sera un Système de retour si c'est un type.
ToString
sur une chaîne.System
espace de noms sont ceux que vous pouvez ignorer les propriétés de la? Voulez-vous vraiment faire cela àSystem.ArgIterator
ouSystem.Nullable<Employee>
?Ici sont quelques-uns des plusieurs possibilités:
myName.GetType().Namespace == "System"
myName.GetType().Namespace.StartsWith("System")
myName.GetType().Module.ScopeName == "CommonLanguageRuntimeLibrary"
ScopeName
est l'épreuve du feuModule.ScopeName
est égal àSystem.Security.dll
donc pas seulement un"CommonLanguageRuntimeLibrary"
doit être vérifié. Je v ajout d'une vérification commemoduleScope == "CommonLanguageRuntimeLibrary" || moduleScope.StartsWith("System") || sourceType.Namespace.StartsWith("System") || sourceType.Namespace.StartsWith("Microsoft")
Si vous ne parvenez pas à définir précisément ce qu'est un "construit dans le système de type" est il semble alors probable que vous ne savez pas quels types sont en aucune réponse donnée. Plus probablement ce que vous voulez faire est juste une liste de types que vous ne voulez pas faire cela avec. Avoir un "IsSimpleType" méthode qui ne fonctionne tout simplement de contre-vérifier les différents types.
L'autre chose que vous pouvez être à la recherche pour les Types Primitifs. Si oui, regardez:
Type.IsPrimitive (http://msdn.microsoft.com/en-us/library/system.type.isprimitive.aspx)
Ce n'inclut pas la chaîne, mais vous pourriez ajouter que sur la main...
Voir aussi Comment faire Pour Tester si le Type est Primitif
Espace de noms basé sur des méthodes peut provoquer des collisions.
Il y a un autre fiable et simple:
Ou un peu plus optimale, la mise en cache du système de montage:
Je pense que c'est la meilleure possibilité:
System.TimeSpan
est perduJ'ai été la construction de quelque chose reflectively et a constaté que la
IsSecurityCritical
propriété semblait de travail à cette fin; toutefois, ce ne fut que grâce à la confiance de niveau pour mon assemblée n'était pas suffisamment élevée pour retourner un peu.Un petit rire; heureusement j'ai trouvé cette question et régler en conséquence.
Note: Le
IsSecurityCritical
propriété n'existe que si .NetFramework > 4Je vais probablement aller avec; la suivante à partir d'une réponse précédente.
Mais, avec un couple de réglages; comme rendant une méthode d'extension sur
Type
et à l'aide d'unconst
pour CommonLanguageRuntimeLibrary