2009-07-11 11 views
5

Je voudrais voir si un objet est builtin data type en C#Y at-il une fonction pour vérifier si un objet est un type de données intégré?

Je ne veux pas vérifier tous si possible.
C'est, je ne le font pas veulent faire:

 Object foo = 3; 
     Type type_of_foo = foo.GetType(); 
     if (type_of_foo == typeof(string)) 
     { 
      ... 
     } 
     else if (type_of_foo == typeof(int)) 
     { 
      ... 
     } 
     ... 

Mise à jour

Je suis en train de créer un récursive PropertyDescriptorCollection où les types de PropertyDescriptor pourraient ne pas être des valeurs intrinsèques. Donc, je voulais faire quelque chose comme ça (ndlr: cela ne fonctionne pas encore, mais je travaille là-dessus):

public override PropertyDescriptorCollection GetProperties(Attribute[] attributes) 
    { 
     PropertyDescriptorCollection cols = base.GetProperties(attributes); 

     List<PropertyDescriptor> list_of_properties_desc = CreatePDList(cols); 
     return new PropertyDescriptorCollection(list_of_properties_desc.ToArray()); 
    } 

    private List<PropertyDescriptor> CreatePDList(PropertyDescriptorCollection dpCollection) 
    { 
     List<PropertyDescriptor> list_of_properties_desc = new List<PropertyDescriptor>(); 
     foreach (PropertyDescriptor pd in dpCollection) 
     { 
      if (IsBulitin(pd.PropertyType)) 
      { 
       list_of_properties_desc.Add(pd); 
      } 
      else 
      { 
       list_of_properties_desc.AddRange(CreatePDList(pd.GetChildProperties())); 
      } 
     } 
     return list_of_properties_desc; 
    } 

    // This was the orginal posted answer to my above question 
    private bool IsBulitin(Type inType) 
    { 
     return inType.IsPrimitive || inType == typeof(string) || inType == typeof(object); 
    } 

Répondre

5

Eh bien, un moyen facile consiste à les lister explicitement dans un ensemble, par ex.

static readonly HashSet<Type> BuiltInTypes = new HashSet<Type> 
    (typeof(object), typeof(string), typeof(int) ... }; 

... 


if (BuiltInTypes.Contains(typeOfFoo)) 
{ 
    ... 
} 

Je dois demander pourquoi il est important que - je peux comprendre comment il pourrait faire une différence si c'est un .NET primitive type, mais pourriez-vous expliquer pourquoi vous voulez que votre application se comporte différemment si elle est l'un des plus pour C# lui-même? Est-ce pour un outil de développement? Selon la réponse à cette question, vous pouvez considérer la situation avec dynamic dans C# 4 - qui n'est pas un type à l'exécution en tant que tel, mais System.Object + un attribut lorsqu'il est appliqué à un paramètre de méthode, etc. .

+0

Je voulais créer récursivement un PropertyDescriptorCollection et j'avais besoin de vérifier si le type est intégré ou non. Je voulais créer une nouvelle collection si l'une des propriétés n'était pas un type intégré. Je vais ajouter ce que j'essaie de faire dans la question, peut-être que cela aidera – SwDevMan81

+0

Mais pourquoi cette décision serait-elle basée sur la spécification C#?Pourquoi voudriez-vous traiter Decimal d'une manière, mais DateTime ou Guid d'une manière différente? –

+0

Bon, ça ne devrait pas être, c'était un oubli de ma part. System.ValueType doit également être vérifié. – SwDevMan81

9

Pas directement, mais vous pouvez faire la vérification simplifiée suivante

public bool IsBulitin(object o) { 
    var type = o.GetType(); 
    return (type.IsPrimitive && type != typeof(IntPtr) && type != typeof(UIntPtr)) 
     || type == typeof(string) 
     || type == typeof(object) 
     || type == typeof(Decimal); 
} 

La vérification IsPrimitive capture tout sauf les chaînes, les objets et les décimales.

EDIT

Bien que cette méthode fonctionne, je préférerais la solution de Jon. La raison est simple, vérifiez le nombre de modifications que j'ai dû apporter à ma solution en raison des types que j'ai oublié étaient ou n'étaient pas des primitives. Il est plus facile de tous les énumérer explicitement dans un ensemble.

+0

juste en catimini @ Jon la mise à jour avant que votre commentaire;) – JaredPar

+1

Vous souhaitez également vérifier pour elle * pas * être IntPtr, qui est primitif mais non intégré. C'est pourquoi je ne suis pas très friand de cette méthode - vous devez comparer les deux listes et calculer les différences, alors qu'un ensemble explicite signifie simplement copier la liste mot à mot de la spécification C# :) –

+0

@Jared: D'où la suppression de mes commentaire :) (Pour ceux qui ne l'ont pas attrapé, la réponse de Jared n'incluait pas la décimale au début, je l'ai commenté pendant qu'il la réparait ...) –

1

Je pense que c'est l'un des meilleurs possibilies:

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