代码之家  ›  专栏  ›  技术社区  ›  Dirk Boer

转换不可为null或返回默认值(类型)的常见方法是什么

  •  3
  • Dirk Boer  · 技术社区  · 10 年前

    在使用ASP.NET MVC中的所有字典(如RouteData、DataTokens等)时,我经常发现自己想要做以下事情:

    bool isLolCat = routeData["isLolcat"] as bool
    

    如果该值为空,则返回已广播的值或默认值(在本例中为false)。

    是否有任何简短、易读、简单的方法可以做到这一点,或者我最好编写一个助手扩展方法?

    扩展方法应该是这样的。

    bool isLolCat = routeData["isLolcat"].TryCast<bool>();
    
    • 如果有一种常见的方法可以做到这一点,我不想用自定义语法重新发明轮子。
    • 当我只是想从字典里得到一个嘘声时,我不想在代码中胡乱写几行。
    3 回复  |  直到 10 年前
        1
  •  4
  •   usr    10 年前

    也许你喜欢这些:

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

    如果没有,你必须写一个助手。我实际上建议使用助手,因为我发布的代码有点混淆了你的意思。我宁愿看到这个:

    routeData.GetOrDefault<bool>("isLolcat")
    

    因为这是你想要的书面文件。

        2
  •  2
  •   James    10 年前

    是否有任何简短、易读、简单的方法可以做到这一点,或者我最好编写一个助手扩展方法?

    我想说你最好自己写扩展,因为你可以明确自己的意图

    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
    
        3
  •  1
  •   Matthew    10 年前

    我认为没有最常见的方法,所有的铸造/转换操作都有自己的特点。

    例如 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);
    }
    

    这样你就可以在 路由数据 类,而不是潜在的空值。

    用法:

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