web-dev-qa-db-fra.com

Façon correcte de vérifier si un type est Nullable

Afin de vérifier si un Type (propertyType) est nullable, j'utilise:

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

Y a-t-il un moyen d'éviter d'utiliser des chaînes magiques?

155
Felice Pollano

Absolument - utilisez Nullable.GetUnderlyingType :

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

Notez que cela utilise la classe statique non générique System.Nullable plutôt que la structure générique Nullable<T>.

Notez également que cela vérifiera si elle représente un type de valeur nullable spécifique (fermé) ... cela ne fonctionnera pas si vous l'utilisez sur un type générique , par exemple.

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...
316
Jon Skeet

Utilisez le code suivant pour déterminer si un objet Type représente un type Nullable. N'oubliez pas que ce code renvoie toujours la valeur false si l'objet Type a été renvoyé à partir d'un appel à GetType.

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

expliqué sur le lien MSDN ci-dessous:

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

De plus, il y a une discussion similaire à ceci SO QA:

Comment vérifier si un objet est nullable?

37
VS1