使用ASP.NET MVC中的所有字典(如RouteData,DataTokens等),我经常发现自己想做类似的事情:
bool isLolCat = routeData["isLolcat"] as bool
将返回转换值,或者当值为null时返回默认值(在本例中为false)。
是否有任何简短易读的简单方法,或者我最好编写辅助扩展方法?
扩展方法会是这样的。
bool isLolCat = routeData["isLolcat"].TryCast<bool>();
答案 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}}