Cómo escribir un método simple, que comprueba si un tipo concreto es una estructura personalizada (creada con public struct { };
) o no.¿Cómo determinar si un tipo .NET es una estructura personalizada?
Comprobación Type.IsValueType
no es suficiente, ya que también es cierto que int
, long
, etc, y la adición de un cheque a !IsPrimitiveType
no excluirá decimal
, DateTime
y tal vez algunos otros tipos de valores. Sé que la mayoría de los incorporados en los tipos de valor son en realidad "estructuras", pero yo sólo quiero comprobar si hay "estructuras personalizados"
Estas preguntas son en su mayoría el mismo pero sin la respuesta que necesito:
EDIT: de las respuestas se menciona la "comprobar si el prefijo 'System'" fue la más estable (aunque sigue siendo un truco). Finalmente decidí crear un atributo con el que se debe decorar la estructura, para que el marco lo recoja como una estructura personalizada. (La otra opción que pensaba era crear una interfaz vacía, y dejar que la estructura implementar la interfaz vacía, pero la forma atributo parecía más elegante)
Aquí es mi corrector original de estructura personalizada si alguien si está interesado:
type.IsValueType && !type.IsPrimitive && !type.Namespace.StartsWith("System") && !type.IsEnum
Solo por curiosidad, ¿por qué quieres detectar esto? – Joren
Fluidez NHibernate + Auto Mapping: configura todas las estructuras personalizadas para manejarlas como componentes (objetos de valor); configurar cualquier otro tipo de valor para que sea un componente (como DateTime o decimal) bloqueará todo el framework (al menos bajo mono) – SztupY
Add on! type.IsEnum –