2013-12-18 4 views
6

Использование Reflection в .Net typeof(DateTime?).Name возвращает «Nullable`1».typeof (DateTime?). Имя == Nullable`1

Есть ли способ вернуть фактический тип в виде строки. (в этом случае «DateTime» или «System.DateTime»)

Я понимаю, что DateTime? is Nullable<DateTime>. Кроме того, я просто ищу тип типа NULL.

+4

Фактический тип IS '' Nullable StuartLC

+0

Достаньте знак вопроса. –

+1

Имейте в виду, что это хорошо, удаление знака вопроса в коде, возможно, что-то сломает. – James

ответ

10

Там есть 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 
+2

'public static string GetTypeName (этот тип типа)' для метода расширения! –

5

Как Указал на Patryk:

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

+1

Единственная проблема с этим заключается в том, что если на практике это универсальный метод получения типа, это также вытащит общий тип для типов типа «Список ». –

+0

@ChrisSinclair. Можно просто добавить проверку, чтобы увидеть, является ли сам тип «Nullable» и генерирует исключение, если это то, что вам нужно. – Servy

+0

@Servy: О, конечно. Я просто хотел указать Чаду на одно из предостережений, так как мы не обязательно знаем полный объем его предполагаемого использования; не хотел, чтобы он удивил его позже по дороге. –

2

Chris Sinclair код работает, но я переписал его более кратким.

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

И затем использовать его:

GetNullableUnderlyingTypeIfNullable(typeof(DateTime?)).Name 
Смежные вопросы