2010-02-18 3 views
7

Pour un Type, il existe une propriété IsClass, mais comment savoir un Type est une structure?Comment identifier si un type est une structure personnalisée?

Désolé, je dois ajouter quelques informations supplémentaires.

  1. J'utilise C#.
  2. Bien que IsValueType est une condition nécessaire, il est évidemment pas suffisant. Pour un Integer est également un type de valeur.
+0

quel langage de programmation? –

+0

duplication possible de [Comment décider un type est une structure personnalisée?] (Http://stackoverflow.com/questions/2296288/how-to-decide-a-type-is-a-custom-struct) – nawfal

Répondre

1

Si c'est un type de valeur (par exemple, un struct), utilisez Type.IsValueType.

1

Vous pouvez utiliser IsValueType.

3

Si vous parlez de C#, vous pouvez utiliser la propriété IsValueType.

-1

utiliser ceci:

x.GetType().IsValueType(); 

help:

Type de propriété :: IsValueType Obtient une valeur indiquant si le type est un type de valeur. Les types de valeurs sont des types représentés sous forme de séquences de bits; les types de valeur ne sont pas des classes ou des interfaces. Les types de valeur sont appelés "structures" dans certains langages de programmation. Les énumérations sont un cas particulier des types de valeur.

+0

Types ont significations différentes lorsqu'elles sont appliquées à un emplacement de stockage que lorsqu'elles sont appliquées à des objets de segment. Sous le capot, chaque type de valeur a un type de tas associé. La conversion d'un type de valeur en 'Object' ou sur une interface implémentée crée un nouvel objet de segment dont les champs sont copiés à partir de l'instance de type valeur en cours de cast. L'appel de 'GetType' sur un type de valeur le convertira d'abord en' Object', puisque les types de valeur n'ont pas le champ type-destrictor requis par 'GetType'. – supercat

0

Eh bien, je suppose que pour vos besoins alors cela relève:

bool isStruct = myType.IsValueType && !myType.IsPrimitive; 

mais toujours DateTime ne sont pas couverts par ce par exemple. Peut-être que vous auriez à ajouter d'autres types que vous souhaitez exclure manuellement.

+2

DateTime donne le bon résultat de vrai avec ce code. C'est enums qu'il ne gère pas correctement. –

10
t.IsValueType && !t.IsPrimitive && !t.IsEnum; 
+0

Je ne comprends pas la raison de '! T.IsPrimitive'. 'Boolean',' Byte', 'Char',' Double' (etc ...) ne sont pas des structures? –

+2

Parfois en C# nous les comptons comme tels, parce qu'ils sont des types de valeur, mais 'struct' vient de 'structuré', se référant à la nature composite des structures (normalement ayant plus d'un champ, bien que 0 ou 1 soit permise) origine du mot-clé retour en C, bien que les structures C# et C soient différentes de plusieurs façons. Il ressort clairement de la question que le PO pensait la dernière voie plutôt que la première. Cette vue ne prend pas une perspective de «tortues tout le long», mais prend les unités qui ne peuvent pas être décomposées plus loin, pour ne pas être des structs. –