2012-01-20 10 views
111

Con el fin de comprobar si un Type (propertyType) es anulable, estoy usando:manera correcta para comprobar si un tipo es anulable

bool isNullable = "Nullable`1".Equals(propertyType.Name) 

¿Hay alguna manera que evite el uso de cuerdas mágicas?

+1

Comprobar si un tipo es 'anulable '? Si es así, eche un vistazo a http://stackoverflow.com/questions/374651/how-to-check-if-an-object-is-nullable –

Respuesta

226

Absolutamente - Utilización Nullable.GetUnderlyingType:

if (Nullable.GetUnderlyingType(propertyType) != null) 
{ 
    // It's nullable 
} 

Tenga en cuenta que este utiliza la clase estática no genérico System.Nullable en lugar de la estructura genérica Nullable<T>.

También tenga en cuenta que los que comprobará si representa una específica (cerrado) anulable tipo de valor ... no va a funcionar si se utiliza en un genérico tipo , por ejemplo,

public class Foo<T> where T : struct 
{ 
    public Nullable<T> Bar { get; set; } 
} 

Type propertyType = typeof(Foo<>).GetProperty("Bar").PropertyType; 
// propertyType is an *open* type... 
+0

¡Genial! ¡Aceptaré tan pronto pueda! –

+0

Parece que ha encontrado un desacuerdo muy interesante entre la especificación (su enlace en la primera línea) y el comportamiento real. Para su objeto 'propertyType' de la última línea hay un contraejemplo. Lo que quiero decir es que 'Nullable.GetUnderlyingType (propertyType)' no ** devuelve null (devuelve tu 'T') aunque' propertyType' es un tipo genérico _open_ ('propertyType.ContainsGenericParameters'). Experimenté un poco, y parece que un tipo genérico abierto con '' Nullable'1'' está OK _unless_ el parámetro de tipo es exactamente el 'T' de' typeof (Nullable <>). GetGenericArguments() [0] '. –

+0

¿Qué quiere decir con "devuelve su T"? Parece que vale la pena agregar como una nueva pregunta, con un ejemplo breve pero completo. –

24

Utilice el siguiente código para determinar si un objeto Type representa un tipo Nullable. Recuerde que este código siempre devuelve falso si el objeto Type fue devuelto por una llamada a GetType.

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) {…} 

explicado en el siguiente enlace de MSDN:

http://msdn.microsoft.com/en-us/library/ms366789.aspx

Por otra parte, hay una discusión similar en este SO QA:

How to check if an object is nullable?

Cuestiones relacionadas