簡體   English   中英

轉換非可空或返回默認值的常用方法是什么(Type)

[英]What is the common way to cast non-nullable or return default(Type)

使用ASP.NET MVC中的所有字典(如RouteData,DataTokens等),我經常發現自己想要做的事情如下:

bool isLolCat = routeData["isLolcat"] as bool

這將返回轉換值,或者當值為null時返回默認值(在本例中為false)。

有沒有簡短,可讀,簡單的方法來做到這一點,還是我最好編寫一個輔助擴展方法?

擴展方法會是這樣的。

bool isLolCat = routeData["isLolcat"].TryCast<bool>();
  • 如果有一種常見的方法,我寧願不想用自定義語法重新發明輪子。
  • 當我只想嘗試從字典中獲取一個bool時,我不想用幾行代碼丟棄我的代碼。

也許你喜歡以下任何一個:

(routeData["isLolcat"] as bool?).GetValueOrDefault()
(routeData["isLolcat"] as bool?).GetValueOrDefault(false)
(routeData["isLolcat"] as bool?) ?? false

如果沒有,你將不得不寫一個幫手。 我實際上建議使用幫助器,因為我發布的代碼模糊了你的意思。 我寧願看到這個:

routeData.GetOrDefault<bool>("isLolcat")

因為這個文件寫的是你想要的。

有沒有簡短,可讀,簡單的方法來做到這一點,還是我最好編寫一個輔助擴展方法?

我會說你會更好地編寫你自己的擴展,因為你可以明確你的意圖

public static class Ext
{
    public static T CastOrDefault<T>(this object obj)
    {
        return obj is T ? (T)obj : default(T);           
    }
}
...
bool isLolCat = RouteData["isLolCat"].CastOrDefault<bool>();

建議 - 如果你想保持簡短,可以稱之為As<T>

bool isLolCat = RouteData["isLolCat"].As<bool>();
string str = RouteData["isLolCat"].As<string>(); // null

我不認為有一種最常見的方式,所有的轉換/轉換操作都有自己的特性。

例如, Convert.ToBool可以接受要轉換的字符串,您希望它轉換,還是應該失敗?

如果不是bool類型的話, x as bool會給你null。

我認為最好為RouteData編寫擴展方法。

public static T GetValueOrDefault<T>(this RouteData routeData, string field)
{
    var value = routeData[field];

    if (value is T)
    {
        return (T)value;
    }

    return default(T);
}

這樣您就可以在RouteData類上操作,而不是潛在的null值。

用法:

var isLolCat = routeData.GetValueOrDefault<bool>("IsLolCat");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM