gpt4 book ai didi

c# - 如何继承资源文件(resx)

转载 作者:太空狗 更新时间:2023-10-29 17:55:29 24 4
gpt4 key购买 nike

假设您正在处理一个由数百个程序集组成的 .Net 4.0 项目,每个程序集都有自己的本地化资源文件 (.resx)。通过使用 ResXFileCodeGenerator(创建“ResourceFile.Designer.cs”文件)自动生成的类从 C# 访问本地化字符串:string test = ResourceFile.TestString;

每个程序集都有特定于它的本地化字符串,但也有所有程序集通用的字符串。您告诉自己,将这些“通用字符串”放在“父”资源文件中会很好,如果资源键在“本地”资源文件中不可用,代码将回退到这些文件上。然后你说“嘿!继承可以在这里工作。”事实上,在自动生成的设计器文件中做这样的事情确实有效: 内部类 ResourceFile : ParentResourceFile也就是说,未在 ResourceFile 中定义但在 ParentResourceFile 中定义的字符串仍然可以使用 ResourceFile.StringInParentFile 访问。

但是设计器文件的 header 中有些东西让您感到困扰:“对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,将会丢失”而且您知道在自动生成的设计器文件中播放是不受欢迎的。所以你来到这里,你问:

  • ResXFileCodeGenerator 何时生成/重新生成设计器类(class)?
  • 有没有办法关闭自动生成?
  • 我们会有放弃 ResXFileCodeGenerator 的优势并实现我们的自己处理 ResourceManager?

然后你说“谢谢”。

最佳答案

在对该问题进行一段时间调查后,我找到了一个解决方法:不对资源文件本身进行继承,而是对需要访问“父”资源的类进行继承。

您只需要有一个基类,其项目包含一个“主”资源文件,并将该资源文件的 CustomTool 属性设置为 PublicResXFileCodeGenerator(“公共(public)”部分很重要,因为它将创建一个public 类,而不是 internal 类)。一个限制是 PublicResXFileCodeGenerator 仅从 VS2008 开始可用(此 CodeProject article 否则可能会有帮助)。

然后,在需要访问“master”资源的类中,简单地继承基类并像这样访问资源:

public class ChildClass : BaseClass
{
string test = BaseClass.BaseResourceFile.TestString; // a common resource
string localResource = ResourceFile.OtherString; // a local resource
}

此解决方案的一个缺点是您必须显式引用 BaseResourceFile 才能访问其中定义的资源;没有回退到父类,就像直接在 Resource 类之间完成继承那样。

为了后代,我会回答我自己的问题:

  • ResXFileCodeGenerator 何时生成/重新生成设计器上课?

    每当添加/删除/修改资源时。

  • 有没有办法关闭自动生成?

    没有。而且无论如何,没有自动生成功能的“代码生成器”工具将毫无用处,您不觉得吗?

  • 我们是否必须放弃 ResXFileCodeGenerator 的优势并实现我们的自己处理 ResourceManager?

    没有,看上面的回答。

我们还考虑使用“链接”文件(从“添加现有项目”对话框,使用“添加为链接”选项)实现一个解决方案,其中一个父资源文件将链接到我们所有的程序集,但由于我们的程序集已经从基类继承,似乎采用继承方式要好得多。

我不太愿意接受我自己的答案,所以如果有人提出更好的解决方案或改进我的解决方案,我会很乐意接受。也就是说,如果有人关心的话。

关于c# - 如何继承资源文件(resx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6874820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com