177 votes

Comment faire pour tester si le Type est primitif

J'ai un bloc de code qui sérialise un type dans une balise Html.

Type t = typeof(T); // I pass <T> in as a paramter, where myObj is of type T
tagBuilder.Attributes.Add("class", t.Name);
foreach (PropertyInfo prop in t.GetProperties())
{
    object propValue = prop.GetValue(myObj, null);
    string stringValue = propValue != null ? propValue.ToString() : String.Empty;
    tagBuilder.Attributes.Add(prop.Name, stringValue);
}

Cela fonctionne très bien, sauf que je veux le faire uniquement pour les types primitifs, comme int, double, bool etc, et d'autres types qui ne sont pas primitive, mais peut être sérialisé facilement comme string. Je veux de l'ignorer tout le reste comme des Listes et d'autres types personnalisés.

Quelqu'un peut-il suggérer comment je le faire? Ou ai-je besoin de spécifier les types je veux permettre à quelque part et de basculer sur le type de la propriété pour voir si c'est autorisé? C'est un peu désordonné, de sorte qu'il serait agréable si je n'était plus propre.

195voto

Javier Points 1728

Vous pouvez utiliser la propriété Type.IsPrimitive, mais être prudent, car il y a des types que l'on peut penser que sont primitifs, mais ils sont, par exemple, Decimal et String.

Edit 1: Ajout d'un exemple de code

Voici un exemple de code:

if (t.IsPrimitive || t == typeof(Decimal) || t == typeof(String) || ... )
{
    // Is Primitive, or Decimal, or String
}

Edit 2: Comme @SLaks commentaires, il y a d'autres types que peut-être vous voulez traiter comme primitives, trop. Je pense que vous aurez à ajouter ces variations , un par un.

63voto

Michael Petito Points 5554

Je viens de trouver cette question tout en regardant pour une solution similaire, et pensé que vous pourriez être intéressés par la démarche suivante à l'aide de System.TypeCode et System.Convert.

Il est facile de sérialiser un type qui est mappé à un System.TypeCode autres qu' System.TypeCode.Object, de sorte que vous pouvez faire:

object PropertyValue = ...
if(Convert.GetTypeCode(PropertyValue) != TypeCode.Object)
{
    string StringValue = Convert.ToString(PropertyValue);
    ...
}

L'avantage de cette approche est que vous n'avez pas de nom de tous les autres acceptable non-type de primitive. Vous pouvez également modifier le code ci-dessus légèrement pour gérer n'importe quel type qui implémente IConvertible.

56voto

jitbit Points 8072

Nous le faisons comme ça dans notre ORM :

Je sais que l’utilisation de `` n’est pas la meilleure option (vous pouvez avoir vos propres structs très complexe), mais ça marche dans 99 % des cas

28voto

Ronnie Overby Points 11402
Par exemple :

0voto

Bahamut Points 121

Je veux juste partager ma solution. Il est peut-être utile à quelqu'un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X