如何继承资源文件(resx)

Posted

技术标签:

【中文标题】如何继承资源文件(resx)【英文标题】:How to do inheritance of Resource files (resx) 【发布时间】:2011-07-29 14:39:27 【问题描述】:

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

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

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

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

然后你说“谢谢”。

【问题讨论】:

【参考方案1】:

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

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

然后,在需要访问“主”资源的类中,只需从基类继承并像这样访问资源:

public class ChildClass : BaseClass

    string test = BaseClass.BaseResourceFile.TestString; // a common resource
    string localResource = ResourceFile.OtherString;     // a local resource

此解决方案的一个缺点是您必须显式引用 BaseResourceFile 才能访问其中定义的资源;如果直接在 Resource 类之间进行继承,则不会像在父类中那样回退。

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

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

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

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

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

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

不,见上面的答案。

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

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

【讨论】:

这对我不起作用...您是如何做到的以便可以调用“BaseClass.BaseResourceFile.TestString”?

以上是关于如何继承资源文件(resx)的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历 .resx 文件中的所有资源

防止资源 [.resx] 文件预编译。 .NET 核心 2.0

WINFORM 如何利用代码动态把资源加入到resources.resx

为啥仅在更改表单大小和添加不是资源的按钮时添加资源 (.resx) 文件

WPF 中.XAML文件如何读取资源文件?

找不到资源文件“**/*.resx”。 (MSB3552) 在 VS for Mac 上