如何将字符串转换为Guid

230

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

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

382
new Guid(string)

你也可以考虑使用 TypeConverter


3
具体而言,是一个内置的GUID转换器。http://msdn.microsoft.com/en-us/library/system.componentmodel.guidconverter.aspx - Joseph Ferris
3
TypeDescriptor.GetConverter(typeof(Guid)) - leppie
@leppie,您能告诉我将GUID作为字符串使用而不是作为数据类型GUID的优缺点吗? - cracker
我可以给你举个例子:@cracker 当你正在制作API并且想要通过Guid过滤某些内容(因为它是表中的主键),你会在请求中从前端发送什么?很可能是URL中的字符串,但在控制器后端中,你最好将其用作Guid。至于速度比较:https://dev59.com/pXRB5IYBdhLWcg3wH0SW - DanteTheSmith
我建议使用@juFo的答案,其中包括TryParse()TryParseExact()。如果您提供了无效的Guid,则在尝试在比较或类似操作中访问它时,将会出现以下异常:FormatException:Guid应该包含32个数字和4个破折号(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。 - Ogglas

148

使用这样的代码:

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

您可以设置您的字符串值,而不是使用 "9D2B0228-4D0D-4C23-8B49-01A698857709"。


33

我之前一直在使用Guid.Parse,但是我发现Guid.TryParse会返回一个布尔值来指示是否成功。这样会更好。 - Rich

8

这将让你接近目标,我在生产中使用它并从未遇到过冲突。但是,如果你查看反射器中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
@Maggie 你可以复制正则表达式,一次带有括号,一次不带 - 这样就是二选一了。 - Sean
1
当有其他解决方案可用时,永远不要使用正则表达式。 - Nick N.
3
@NickN. 这篇文章是2008年发布的,当时还没有 Guid.TryParse 方法。 - Brian Rudolph
3
@BrianRudolph 好的,没问题 :) 不好意思,请更新你的回答。 - Nick N.

3

很遗憾,没有TryParse()的等效方法。如果您创建一个System.Guid的新实例并传入字符串值,则可以捕获三种可能的异常(如果无效)。

这些包括:

  • ArgumentNullException
  • FormatException
  • OverflowException

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


0
如果你只需要一些非常基本的错误检查,你可以检查字符串的长度。
              string guidStr = "";
              if( guidStr.Length == Guid.Empty.ToString().Length )
                 Guid g = new Guid( guidStr );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接