转换非可空或返回默认值的常用方法是什么(Type)

时间:2014-08-16 14:36:09

标签: c# syntax casting

使用ASP.NET MVC中的所有字典(如RouteData,DataTokens等),我经常发现自己想做类似的事情:

bool isLolCat = routeData["isLolcat"] as bool

将返回转换值,或者当值为null时返回默认值(在本例中为false)。

是否有任何简短易读的简单方法,或者我最好编写辅助扩展方法?

扩展方法会是这样的。

bool isLolCat = routeData["isLolcat"].TryCast<bool>();
  • 如果有一种常用的方法,我宁愿不想用自定义语法重新发明轮子。
  • 当我只想尝试从字典中获取一个bool时,我不想用几行代码丢弃我的代码。

3 个答案:

答案 0 :(得分:4)

也许您喜欢以下任何一种:

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

如果不是,你将不得不写一个帮手。我实际上建议使用帮助器,因为我发布的代码模糊了你的意思。我宁愿看到这个:

routeData.GetOrDefault<bool>("isLolcat")

因为这份文件写的是你想要的。

答案 1 :(得分:2)

  

是否有任何简短易读的简单方法,或者我最好编写辅助扩展方法?

我说你会更好地编写自己的扩展程序,因为你可以明确表达你的意图

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

答案 2 :(得分:1)

我不认为有一种最常见的方式,所有的转换/转换操作都有自己的特性。

例如,Convert.ToBool可以接受要转换的字符串,您希望转换,还是应该失败?

如果x as bool不是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"); 类上操作,而不是潜在的空值。

用法:

{{1}}