C# 在编译时生成Guid

C# 在编译时生成Guid,c#,compiler-construction,compiler-errors,constants,guid,C#,Compiler Construction,Compiler Errors,Constants,Guid,我试图生成一个常量值,我将使用它,如下所示: public class Foo() { public const String ExtensionKey = Guid.NewGuid().ToString(); public int ID { get; set; } } 编译器正在抛出一个错误: 分配给'Foo.ExtensionKey'的表达式必须是常量 我知道不可能在编译时执行方法(构造函数或类型初始值设定项)。我正在寻找一种解决方法,将随机生成的Guid分配给不同类的不同

我试图生成一个常量值,我将使用它,如下所示:

public class Foo()
{
    public const String ExtensionKey = Guid.NewGuid().ToString();
    public int ID { get; set; }
}
编译器正在抛出一个错误:

分配给'Foo.ExtensionKey'的表达式必须是常量

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

编辑:


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

静态只读
替换
Const
可以获得几乎相同的行为

public static readonly String ExtensionKey = Guid.NewGuid().ToString();
调用
Guid.NewGuid()
每次都会返回一个新的Guid,这就是为什么会出现异常。您可以将
const
替换为
readonly
static
或将固定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";

这个问题缺乏细节;您希望GUID在每个类和进程中都是唯一的,还是在每个类中都是唯一的,但每次启动程序时都是相同的?这是两件完全不同的事情

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

我建议阅读这篇文章,了解如何从字符串生成GUID,实际代码驻留在该字符串上

通过使用类似的内容并使用类的全名作为输入,您将获得每个类的唯一GUID,但每个进程的GUID仍然相同(此答案中的大部分是从对问题的注释中“升级的”)


在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
type字段,则不能在C#中声明它
const
。然后你会做:

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

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

在Visual Studio中,可以选择“工具”-“创建GUID”。或者在Windows PowerShell中,您可以说
[Guid]::NewGuid().ToString()
。这将为您提供一个
Guid
。然后,您可以将该特定
Guid
you
string
的字符串表示形式设置为常量。您应该将其设置为应答。我扩展了该注释并将其转换为应答。这将为每个对象实例生成不同的Guid。我需要所有实例中唯一的Guid,如果将其更改为
static
,则每次运行应用程序时都会创建一个新的
Guid