2010-02-01 7 views
7

Étant donné une instance PropertyInfo, qui a une propriété Type, comment détermine-t-on s'il s'agit d'une structure? J'ai trouvé il y a des propriétés telles que IsPrimitive, IsInterface, etc. mais je ne suis pas sûr de savoir comment demander une structure?Comment déterminer si Type est une structure?

EDIT: Pour clarifier la question. Supposons que j'ai une méthode:

public Boolean Check(PropertyInfo pi) 
{ 
    return pi.Type.IsStruct; 
} 

Que dois-je écrire au lieu de IsStruct?

Répondre

10

Type.IsValueType devrait faire l'affaire.

(pincé de here)

+0

Merci. Je suppose que je devrais aussi vérifier pour! IsPrimitive, mais cela devrait faire l'affaire. –

+2

@Dejan: aussi les primitives (comme les booléens) sont des structures. –

+0

Vous avez raison, vous aurez besoin du! IsPrimitive. Qu'en est-il d'une méthode d'extension? : D – OregonGhost

1

mettre les commentaires sur la réponse de Antony Koch dans une méthode extention:

public static class ReflectionExtensions { 
     public static bool IsCustomValueType(this Type type) {    
       return type.IsValueType && !type.IsPrimitive && type.Namespace != null && !type.Namespace.StartsWith("System."); 
     } 
    } 

devrait fonctionner

+0

Déterminez si vous souhaitez inclure ou exclure 'IsEnum' - si vous recherchez uniquement des structures personnalisées. –

1

Structs et énumérations (IsEnum) tombent sous le surensemble appelés types de valeur (IsValueType). Les types primitifs (IsPrimitive) sont un sous-ensemble de struct. Ce qui signifie que tous les types primitifs sont des structures mais pas vice versa; par exemple, int est un type primitif ainsi que struct, mais decimal est seulement une structure, pas un type primitif.

Vous voyez donc que la seule propriété manquante est celle d'une structure. Facile à écrire un:

public bool IsStruct(this Type type) 
{ 
    return type.IsValueType && !type.IsEnum; 
} 
Questions connexes