2013-12-18 24 views
6

Utilizzo di Reflection in .Net typeof(DateTime?).Name restituisce "Nullable`1".typeof (DateTime?). Name == Nullable`1

Esiste un modo per restituire il tipo effettivo come stringa. (in questo caso "DateTime" o "System.DateTime")

Capisco che DateTime? è Nullable<DateTime>. Questo è oltre il punto, sto solo cercando il tipo del tipo nullable.

+4

Il tipo effettivo è '' Nullable StuartLC

+0

Estrarre il punto interrogativo. –

+1

Tenete presente come test va bene, la rimozione del punto interrogativo nel codice probabilmente causerà la rottura di qualcosa. – James

risposta

10

C'è un metodo Nullable.GetUnderlyingType che può aiutare in questo caso. Probabilmente si finirà per voler fare il proprio metodo di utilità perché (sto supponendo) sarete utilizzando i tipi sia nullable e non-nullable:

public static string GetTypeName(Type type) 
{ 
    var nullableType = Nullable.GetUnderlyingType(type); 

    bool isNullableType = nullableType != null; 

    if (isNullableType) 
     return nullableType.Name; 
    else 
     return type.Name; 
} 

Usage:

Console.WriteLine(GetTypeName(typeof(DateTime?))); //outputs "DateTime" 
Console.WriteLine(GetTypeName(typeof(DateTime))); //outputs "DateTime" 

EDIT: ho il sospetto si può anche utilizzare altri meccanismi sul tipo, nel qual caso è possibile modificare leggermente questo per ottenere il tipo sottostante o utilizzare il tipo esistente se è non annullabile:

public static Type GetNullableUnderlyingTypeOrTypeIfNonNullable(this Type possiblyNullableType) 
{ 
    var nullableType = Nullable.GetUnderlyingType(possiblyNullableType); 

    bool isNullableType = nullableType != null; 

    if (isNullableType) 
     return nullableType; 
    else 
     return possiblyNullableType; 
} 

E questo è un terribile nome per un metodo, ma non sono abbastanza intelligente per venire con uno (sarò felice di cambiare se qualcuno suggerisce uno migliore!)

Poi, come un metodo di estensione, l'utilizzo potrebbe essere come:

public static string GetTypeName(this Type type) 
{ 
    return type.GetNullableUnderlyingTypeOrTypeIfNonNullable().Name; 
} 

o

typeof(DateTime?).GetNullableUnderlyingTypeOrTypeIfNonNullable().Name 
+2

'stringa statica pubblica GetTypeName (questo tipo di tipo)' per il metodo di estensione! –

5

Come sottolineato da Patryk:

typeof(DateTime?).GetGenericArguments()[0].Name

+1

Unico problema con questo, è che se in pratica, è un metodo genericamente utilizzato per ottenere il tipo, questo estrae anche il tipo generico per tipi come 'Lista '. –

+0

@ChrisSinclair Si può semplicemente aggiungere un controllo per vedere se il tipo stesso è 'Nullable' e lanciare un'eccezione, se questo è il comportamento necessario. – Servy

+0

@Servy: Oh, certo. Volevo solo far notare a Chad una delle avvertenze di questo, dal momento che non conosciamo necessariamente la portata completa del suo uso previsto; non volevo che lo sorprendesse più avanti lungo la strada. –

2

Chris Sinclair opere codice, ma ho riscritto più concisa.

public static Type GetNullableUnderlyingTypeIfNullable(Type possiblyNullableType) 
    { 
     return Nullable.GetUnderlyingType(possiblyNullableType) ?? possiblyNullableType; 
    } 

e poi usarlo:

GetNullableUnderlyingTypeIfNullable(typeof(DateTime?)).Name 
Problemi correlati