强制转换非空值或返回默认值(类型)的常见方法是什么?

本文关键字:类型 常见 方法 是什么 默认值 转换 空值 返回 | 更新日期: 2023-09-27 18:18:21

使用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

如果没有,您将不得不编写一个帮助程序。实际上,我建议使用helper,因为我发布的代码有点混淆了您的意思。我宁愿看这个:

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可以接受要转换的字符串,您希望它转换,还是应该失败?

x as bool将给你null,如果它不是bool类型。

我认为最好为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类,而不是潜在的空值。

用法:

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