如何继承资源文件(resx)
本文关键字:资源 源文件 resx 继承 何继承 | 更新日期: 2023-09-27 18:03:51
想象一下,您正在处理一个由数百个程序集组成的.Net 4.0项目,每个程序集都有自己的资源文件(.resx(用于本地化。本地化字符串通过ResXFileCodeGenerator(创建一个"ResourceFile.Designer.cs"文件(自动生成的类从C#访问:string test = ResourceFile.TestString;
每个程序集都有特定的本地化字符串,但也有所有程序集通用的字符串。您告诉自己,如果在"父"资源文件中有这些"公共字符串"会很好,如果"本地"资源文件没有资源键,代码就会回退到该文件上。然后你会说"嘿!继承可以在这里工作。"事实上,在自动生成的设计器文件中这样做确实有效:internal class ResourceFile : ParentResourceFile
也就是说,未在ResourceFile
中定义但在ParentResourceFile
中定义的字符串仍然可以用ResourceFile.StringInParentFile
访问。
但是设计器文件头中的某些内容会困扰您:">对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,将丢失。"此外,您知道在自动生成的设计器文件中播放是不受欢迎的。所以你来到这里,问:
- ResXFileCodeGenerator何时生成/重新生成设计器阶级
- 有没有办法关闭自动生成
- 我们会放弃ResXFileCodeGenerator的优势,实现我们的自己对ResourceManager的处理
然后你说"谢谢"。
在调查了这个问题一段时间后,我找到了一个解决方法:不继承资源文件本身,而是继承需要访问"父"资源的类。
您只需要有一个基类,其项目包括一个"主"资源文件,并将该资源文件的CustomTool属性设置为PublicResXFileCodeGenerator("公共"部分很重要,因为它将创建一个public
类,而不是internal
类(。一个限制是PublicResXFileCodeGenerator只能从VS2008开始使用(否则这篇CodeProject文章可能会有所帮助(。
然后,在需要访问"主"资源的类中,只需从基类继承并访问如下资源:
public class ChildClass : BaseClass
{
string test = BaseClass.BaseResourceFile.TestString; // a common resource
string localResource = ResourceFile.OtherString; // a local resource
}
此解决方案的一个缺点是,必须显式引用BaseResourceFile才能访问在那里定义的资源;没有像在Resource类之间直接进行继承那样回退到父类。
为了子孙后代,我将回答我自己的问题:
ResXFileCodeGenerator何时生成/重新生成设计器阶级
每当添加/删除/修改资源时。
有办法关闭自动生成吗
没有。不管怎样,一个没有自动生成的"代码生成器"工具是非常无用的,你不认为吗?
我们是否必须放弃ResXFileCodeGenerator的优势,实现我们的自己对ResourceManager的处理
不,见上面的答案。
我们还考虑使用"链接"文件(从"添加现有项"对话框中,使用"添加为链接"选项(实现一个解决方案,其中一个父资源文件将链接到我们的所有程序集,但由于我们的程序集已经从基类继承,因此采用继承方式似乎要好得多。
我真的不愿意接受自己的答案,所以如果有人提出更好的解决方案或改进我的解决方案,我很乐意接受。也就是说,如果有人在乎的话。