2012-01-20 23 views
111

W celu sprawdzenia, czy Type (propertyType) jest pustych, używam:poprawny sposób sprawdzić, czy typ jest Nullable

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

Czy jest jakiś sposób, aby uniknąć używania magicznych sznurki?

+1

Sprawdź, czy typ jest 'Nullable '? Jeśli tak, zajrzyj na http://stackoverflow.com/questions/374651/how-to-check-if-an-object-is-nullable –

Odpowiedz

226

Absolutnie - użyj Nullable.GetUnderlyingType:

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

pamiętać, że ta wykorzystuje nierodzajową klasę statyczną System.Nullable zamiast generycznego struct Nullable<T>.

Należy również pamiętać, że sprawdzi, czy to oznacza specyficzny (zamknięte) typ wartości zerowalne ... to nie będzie działać, jeśli używasz go na generycznego typu, na przykład

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

Świetnie! Przyjmę, jak tylko będę mógł! –

+0

Wygląda na to, że znalazłeś bardzo interesującą niezgodność między specyfikacją (twój link w pierwszym wierszu) a rzeczywistym zachowaniem. Dla twojego obiektu 'propertyType' z ostatniego wiersza jest przeciw-przykład. Mam na myśli to, że 'Nullable.GetUnderlyingType (propertyType)' nie ** nie ** zwraca null (zwraca twoje 'T'), chociaż' propertyType' jest typem _open_ generic ('propertyType.ContainsGenericParameters'). Trochę eksperymentowałem i wygląda na to, że otwarty rodzaj ogólny z '' Nullable'1'' jest w porządku _nie ma żadnych_ parametrów Parametr type jest dokładnie 'T' od' typeof (Nullable <>). GetGenericArguments() [0] '. –

+0

Co masz na myśli, mówiąc: "zwraca T"? To brzmi jak warto dodać jako nowe pytanie, z krótkim, ale pełnym przykładem. –

24

Poniższy kod służy do określania, czy obiekt typu reprezentuje typ z możliwością zerowania. Pamiętaj, że ten kod zawsze zwraca wartość false, jeśli obiekt Type został zwrócony z wywołania metody GetType.

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

wyjaśnione w poniższym MSDN link:

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

Ponadto istnieje podobna dyskusja w tym SO QA:

How to check if an object is nullable?

Powiązane problemy