2013-12-18 90 views
6

在.Net typeof(DateTime?).Name中使用反射返回「Nullable`1」。typeof(DateTime?)。Name == Nullable`1

有什麼方法可以將實際類型返回爲字符串。 (在這種情況下「DateTime」或「System.DateTime」)

我知道DateTime?Nullable<DateTime>。除此之外,我只是在尋找可空類型的類型。

+4

的實際類型是可空'' StuartLC

+0

取出問號。 –

+1

請記住,這是一個很好的測試,刪除代碼中的問號可能會破壞某些東西。 – James

回答

10

有一個Nullable.GetUnderlyingType方法,它可以幫助你在這種情況下。有可能到頭來你會想使自己的效用的方法,因爲(我假設),你就可以同時使用可空和非可空類型:

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" 

編輯:我懷疑你也可以用在其他類型的機制,在這種情況下,你可以稍微修改此得到基本類型或使用現有的類型,如果是不可爲空:

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

'公共靜態字符串GetTypeName(這種類型)'擴展方法! –

5

正如Patryk指出:

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

+1

與此唯一的問題是,如果在實踐中,它是一種通用的方法來獲取類型,這也將拉出類似「列表」的泛型類型。 –

+0

@ChrisSinclair只需添加一個檢查來查看類型本身是否爲'Nullable'並拋出異常,如果這是您需要的行爲。 – Servy

+0

@Servy:哦,當然。我只是想向乍得提出這方面的一個注意事項,因爲我們不一定知道他的預期用法的全部範圍;不想讓他在以後的道路上感到驚訝。 –

2

克里斯·辛克萊代碼的作品,但我重寫了它更加簡潔。

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

,然後使用它:

GetNullableUnderlyingTypeIfNullable(typeof(DateTime?)).Name 
相關問題