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
fonte
2013-12-18 13:47:02
Il tipo effettivo è '' Nullable –
StuartLC
Estrarre il punto interrogativo. –
Tenete presente come test va bene, la rimozione del punto interrogativo nel codice probabilmente causerà la rottura di qualcosa. – James