【问题标题】:How to try convert a string to a Guid [duplicate]如何尝试将字符串转换为 Guid [重复]
【发布时间】:2010-09-25 21:59:18
【问题描述】:

我没有找到 Guid 的 TryParse 方法。我想知道其他人如何处理将字符串格式的 guid 转换为 guid 类型。

Guid Id;
try
{
    Id = new Guid(Request.QueryString["id"]);
}
catch
{
    Id = Guid.Empty;
}

【问题讨论】:

    标签: c#


    【解决方案1】:
    new Guid(string)
    

    您也可以使用TypeConverter

    【讨论】:

    • 具体来说是一个GUIDConverter,它是内置的。msdn.microsoft.com/en-us/library/…
    • TypeDescriptor.GetConverter(typeof(Guid))
    • @leppie 你能告诉我使用 GUID 作为字符串而不是作为 DataTyps GUID 的利弊
    • 我可以告诉你一个例子:@cracker 当你正在制作 API 并且你想通过 Guid 过滤某些东西(因为它在表中的主键)你会在请求中从前面发送什么?很可能是 URL 中的字符串,但在控制器的后面,您最想将其用作 Guid。至于速度对比:stackoverflow.com/questions/713109/…
    • 我建议@juFo 回答TryParse()TryParseExact()。如果您提供无效的 Guid,则在尝试以比较或类似方式访问它时会出现以下异常: FormatException: Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
    【解决方案2】:

    不幸的是,没有等效的 TryParse()。如果您创建一个 System.Guid 的新实例并传入字符串值,您可以捕获它在无效时抛出的三个可能的异常。

    这些是:

    • ArgumentNullException
    • 格式异常
    • 溢出异常

    我已经看到了一些实现,如果您只是想验证它而不是创建它,您可以在创建实例之前对字符串执行正则表达式。

    【讨论】:

      【解决方案3】:

      这会让你非常接近,我在生产中使用它并且从未发生过碰撞。但是,如果您查看反射器中 guid 的构造函数,您将看到它所做的所有检查。

       public static bool GuidTryParse(string s, out Guid result)
          {
              if (!String.IsNullOrEmpty(s) && guidRegEx.IsMatch(s))
              {
                  result = new Guid(s);
                  return true;
              }
      
              result = default(Guid);
              return false;
          }
      
          static Regex guidRegEx = new Regex("^[A-Fa-f0-9]{32}$|" +
                                "^({|\\()?[A-Fa-f0-9]{8}-([A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}(}|\\))?$|" +
                                "^({)?[0xA-Fa-f0-9]{3,10}(, {0,1}[0xA-Fa-f0-9]{3,6}){2}, {0,1}({)([0xA-Fa-f0-9]{3,4}, {0,1}){7}[0xA-Fa-f0-9]{3,4}(}})$", RegexOptions.Compiled);
      

      【讨论】:

      • 此正则表达式匹配“92841CDF-734C-46b4-A40C-53B8B59947AA}”,由于缺少括号而无效。任何人都知道改变这个正则表达式以不匹配这种情况的方法吗?
      • @Maggie 你可以复制正则表达式,一次带括号,一次不带 - 所以它是非此即彼。
      • 当有其他解决方案可用时,切勿使用正则表达式。
      • @NickN。这篇文章是 2008 年的,当时还没有 Guid.TryParse
      • @BrianRudolph 很公平 :) 对不起。也许更新你的答案。
      【解决方案4】:

      如果你想要的只是一些非常基本的错误检查,你可以只检查字符串的长度。

                    string guidStr = "";
                    if( guidStr.Length == Guid.Empty.ToString().Length )
                       Guid g = new Guid( guidStr );
      

      【讨论】:

        【解决方案5】:

        【讨论】:

        • 我一直在使用 Guid.Parse,但我看到 Guid.TryParse 将返回一个布尔值,指示它是否成功。这样会更好。
        【解决方案6】:

        使用这样的代码:

        new Guid("9D2B0228-4D0D-4C23-8B49-01A698857709")
        

        您可以设置字符串值,而不是“9D2B0228-4D0D-4C23-8B49-01A698857709”

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-14
          • 1970-01-01
          • 1970-01-01
          • 2017-01-30
          • 2017-01-03
          • 2011-11-04
          相关资源
          最近更新 更多