在编译时生成Guid

时间:2013-01-26 10:55:09

标签: c# compiler-construction compiler-errors const guid

我正在尝试生成一个我将使用的常量值,如下所示:

public class Foo()
{
    public const String ExtensionKey = Guid.NewGuid().ToString();
    public int ID { get; set; }
}

编译器抛出错误:

The expression being assigned to 'Foo.ExtensionKey' must be constant

我知道在编译时不可能执行方法(构造函数或类型初始值设定项)。我正在寻找一种解决方法,将随机生成的Guid分配给不同类的不同ExtensionKey常量。

修改

目的是为每种类型生成一个独特的Guid。对于所有对象实例以及应用程序运行时,Guid值必须相同。这是Const的行为,我正在寻找尊重它的方法。

4 个答案:

答案 0 :(得分:4)

每次呼叫Guid.NewGuid()都会返回一个新的GUID,这就是你得到例外的原因。您可以将const替换为readonlystatic,或将固定GUID字符串与const一起使用。

public class Foo
{
    // Fixed "forever" or until you manually change it
    // Cannot be changed in run-time
    public const String ExtensionKey = "3c88c196-06ec-4a89-bffa-6f3fd221f425";

    // You will get a new GUID per each Application Domain and per each run
    // Can be changed
    public static String ExtensionKey1 = Guid.NewGuid().ToString();

    // By convention this shall be private, as it's a field
    // You will get a new GUID per each instance of a class,
    // Once assigned, the value cannot be changed
    public readonly String ExtensionKey3 = Guid.NewGuid().ToString();

    // You will get a new GUID per each Application Domain and per each run,
    // Once assigned, the value cannot be changed
    public static readonly String ExtensionKey4 = Guid.NewGuid().ToString();
}

修改

  

目的是为每种类型生成一个独特的Guid。 Guid值   对于所有对象实例和每当对象实例必须相同   申请运行。

手动生成新GUID并使用第一个选项

    // Fixed "forever" or until you manually change it
    // Cannot be changed in run-time
    public const String ExtensionKey = "3c88c196-06ec-4a89-bffa-6f3fd221f425";

答案 1 :(得分:4)

(这个答案的大部分都是从评论中提升到“问题”。)

在Visual Studio中,您可以选择“工具” - “创建GUID”。或者在Windows PowerShell中,您可以说[Guid]::NewGuid().ToString()。这会给你一个Guid。然后,您可以将该特定Guid的字符串表示形式设为string常量。

public const string ExtensionKey = "2f07b447-f1ba-418b-8065-5571567e63f6";

当然,Guid是固定的。标记为const的字段始终为static(但您不得提供static关键字;这是暗示的。)

如果您想要Guid类型的字段,则无法在C#中声明const。然后你会这样做:

public static readonly Guid ExtensionKey = new Guid("2f07b447-f1ba-418b-8065-5571567e63f6");

readonly表示该字段只能从同一个类的(static)构造函数中更改(派生类的构造函数不正常)。

答案 2 :(得分:3)

const替换为static readonly

,您可以获得几乎相同的行为
public static readonly String ExtensionKey = Guid.NewGuid().ToString();

答案 3 :(得分:0)

这个问题缺乏一些细节;你希望你的GUID在每个类和进程中是唯一的,或者每个类是唯一的,但每次启动程序时都是一样的吗?这是两件非常不同的事情。

如果您希望每个类和进程具有唯一的GUID,那么您已经有了一些有效的答案,但是如果您希望每个类具有唯一的GUID,而不是每个进程,那么您需要一些其他方法来解决您的问题。要么在代码中输入GUID,要么使用某种GUID生成器,它使用一些文本作为输入,而不是基于时钟或类似的随机数生成器。

我建议阅读此blog post关于从字符串生成GUID,实际代码位于GitHub

通过使用类似的东西并使用类的全名作为输入,您将获得每个类的唯一GUID,但每个进程仍然相同