【问题标题】:Declare a const string from a resource从资源中声明一个 const 字符串
【发布时间】:2018-06-29 06:17:46
【问题描述】:

当我从 resx 声明一个 const 时,我遇到了编译错误。

private const string ERROR_MESSAGE = MyResource.ResourceManager.GetString("resx_key");

我明白为什么会出现此编译消息,但有什么技巧可以从资源中声明 const 吗?

【问题讨论】:

    标签: c# resources constants resx


    【解决方案1】:

    这是因为const 必须是编译时间常数。引用 MSDN 文档:

    常量是不可变的值,在编译时是已知的,在程序的生命周期内不会改变。

    来自https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/constants

    在您的情况下,值来自方法调用。所以编译的时候可能不知道结果。原因是常量值直接替换到IL代码中。

    事实上,当编译器在 C# 源代码中遇到常量标识符(例如,月份)时,它会将文字值直接替换为它生成的中间语言 (IL) 代码。

    因此,您可以在这里使用static readonly,而不是const

    private static readonly string ERROR_MESSAGE = MyResource.ResourceManager.GetString("resx_key");
    

    【讨论】:

    • 我知道这一切,但我不能在我的情况下使用只读,因为我需要它作为 System.ComponentModel.DataAnnotations 的属性。必需属性的 ValidationAttribute ErrorMessage 必须是一个常量。我知道还有 2 个其他 ValidationAttribute、ErrorMessageResourceName 和 ErrorMessageResourceType 来解决问题,但它也无济于事,这就是原因:
    • @G.Dealmeida 好的,我不知道你是怎么做到的。您可能想就有关预期用途的信息提出一个新问题。您可以链接到此问题的上下文,但请尝试在该问题本身中包含所有必要的信息。
    • 在客户端-服务器应用程序上,我有一个服务器端和客户端通用的第一个项目,我在其中合并了解决方案的所有项目的所有资源。此项目在所有客户端相关项目中引用的另一个客户端项目中引用。我不想用合并的资源引用项目。越想越快要放弃DataAnnotation,直接在ViewModel中处理所有的数据校验业务规则
    • 实际上,对于您回答的这个具体问题,正如我所预料的那样,“这是不可能的”。您还提供了一种解决方法,这与我的具体问题无关,但您无法从这个简单的问题中猜测。我现在将这个问题标记为已回答,我将稍微回顾一下架构。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2020-10-18
    • 2021-09-26
    • 1970-01-01
    • 2016-03-09
    相关资源
    最近更新 更多