Там есть Nullable.GetUnderlyingType
метод, который может помочь вам в этом случае. Скорее всего, вы будете в конечном итоге хотят сделать свой собственный служебный метод, потому что (я предполагаю) вы будете использовать как 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;
}
Использование:
Console.WriteLine(GetTypeName(typeof(DateTime?))); //outputs "DateTime"
Console.WriteLine(GetTypeName(typeof(DateTime))); //outputs "DateTime"
EDIT: Я подозреваю, что вы также можете использовать другие механизмы по типу, в этом случае вы можете немного изменить это, чтобы получить базовый тип или использовать существующий тип, если это не-обнуляемое:
public static Type GetNullableUnderlyingTypeOrTypeIfNonNullable(this Type possiblyNullableType)
{
var nullableType = Nullable.GetUnderlyingType(possiblyNullableType);
bool isNullableType = nullableType != null;
if (isNullableType)
return nullableType;
else
return possiblyNullableType;
}
И это страшного имени метода, но я не достаточно умен, чтобы придумать один (я буду счастлив, чтобы изменить его, если кто-то предлагает лучший друг!)
Тогда, как метод расширения, ваше использование может быть как:
public static string GetTypeName(this Type type)
{
return type.GetNullableUnderlyingTypeOrTypeIfNonNullable().Name;
}
или
typeof(DateTime?).GetNullableUnderlyingTypeOrTypeIfNonNullable().Name
Фактический тип IS '' Nullable –
StuartLC
Достаньте знак вопроса. –
Имейте в виду, что это хорошо, удаление знака вопроса в коде, возможно, что-то сломает. – James