2010-02-18 27 views
7

Para un Type, hay una propiedad IsClass, pero ¿cómo saber un Type es una estructura?¿Cómo identificar si un tipo es una estructura personalizada?

Lo siento, tengo que agregar algo más de información.

  1. Estoy usando C#.
  2. Aunque IsValueType es una condición necesaria, obviamente no es suficiente. Para un entero es un tipo de valor también.
+0

¿Qué lenguaje de programación? –

+0

posible duplicado de [¿Cómo decidir que un tipo es una estructura personalizada?] (Http://stackoverflow.com/questions/2296288/how-to-decide-a-type-is-a-custom-struct) – nawfal

Respuesta

1

Si se trata de un tipo de valor (por ejemplo, un struct), use Type.IsValueType.

1

Puede usar IsValueType.

3

Si está hablando de C#, puede usar la propiedad IsValueType.

-1

uso esto:

x.GetType().IsValueType(); 

De ayuda:

Tipo :: IsValueType Propiedad Obtiene un valor que indica si el tipo es un tipo de valor. Los tipos de valores son tipos que se representan como secuencias de bits; los tipos de valor no son clases o interfaces. Los tipos de valores se denominan "estructuras" en algunos lenguajes de programación. Los enumeraciones son un caso especial de tipos de valores.

+0

Tipos tienen diferentes significados cuando se aplica a la ubicación de almacenamiento que cuando se aplica a objetos de montón. Debajo del capó, cada tipo de valor tiene un tipo de pila asociado. Al convertir un tipo de valor en 'Objeto' o en una interfaz que implementa, se creará un nuevo objeto de montón cuyos campos se copian de la instancia de tipo de valor que se está emitiendo. Llamar a 'GetType' en un tipo de valor lo convertirá primero en' Object', ya que los tipos de valor no tienen el campo type-destrictor requerido por 'GetType'. – supercat

0

Pues bien, supongo que para su requerimiento, entonces esto se acerca:

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

pero aún DateTime no está cubierto por la que, por ejemplo. Tal vez tendrías que agregar más tipos que quieras excluir manualmente.

+2

DateTime da el resultado correcto de verdadero con este código. Son enumeraciones que no maneja correctamente. –

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

No consigo el motivo de '! T.IsPrimitive'. 'Boolean',' Byte', 'Char',' Double' (etc ...) no son estructuras? –

+2

A veces en C# los contamos como tales, porque son tipos de valor, pero 'struct' proviene de" estructurado ", refiriéndose a la naturaleza compuesta de las estructuras (que normalmente tiene más de un campo, aunque 0 o 1 es permisible) y el origen de la palabra clave en C, aunque las estructuras C# y C son diferentes de varias maneras. Está claro a partir de la pregunta que el OP estaba pensando de la última manera en lugar de la anterior. Esta vista no tiene una perspectiva de "tortugas hasta el fondo", pero toma las unidades que no se pueden romper más, para no ser estructuras. –

Cuestiones relacionadas