我创建了一个继承自ResourceManager的类。我的问题是,如果我更改我的Resources.Designer.cs以使用它,
e.g。
private static global::System.Resources.ResourceManager _resourceManager;
到
private static global::MyProject.Resources.MyResourceManager _resourceManager;
它被ResXFileCodeGenerator覆盖并重新设置为默认的System.Resources.ResourceManager
。
我不想关闭ResXFileCodeGenerator。但有没有办法告诉它使用哪个ResourceManager
类?
我被告知要查看ResXFileCodeGeneratorEx,但是在这方面我们真的看不出有什么不同。
答案 0 :(得分:4)
有点迟了但使用反射可以解决这个问题。我把这段代码放在Startup.cs文件中。
var innerField = typeof(Resources.Resources).GetField("resourceMan",
BindingFlags.NonPublic | BindingFlags.Static);
if (innerField != null)
{
innerField.SetValue(null,
new ExtendedResourceManager("MyNamespace.ResourceFileWithoutResx",
typeof(Resources.Resources).Assembly));
}
因为设计器生成的文件可供所有人查看,所以只需修改我基于ResourceManager编写的代码{get;为你生成的代码。
您可以创建自己的ExtendedResourceManager类并根据需要覆盖所有属性。
快乐的编码。
答案 1 :(得分:0)
我设法使用T4实现了这个目标
https://msdn.microsoft.com/en-us/library/bb126445.aspx
基本上允许以ResXFileCodeGenerator的方式生成自动代码。
这不是一个完美的解决方案,因为复制ResXFileCodeGenerator的功能需要做很多工作,并且每次保存.resx文件时它都不会自动运行而无需安装另一个Visual Studio自定义工具将不得不让项目的所有开发人员安装。
答案 2 :(得分:0)
@James Woodall:我必须稍微更改你的代码才能使用正确的语言文件:
var innerField = typeof(Resources.Resources).GetField("resourceMan",
BindingFlags.NonPublic | BindingFlags.Static);
innerField.SetValue(null,
new ExtendedResourceManager("MyNamespace.ResourceFileWithoutResx",
typeof(Resources.Resources).Assembly));
innerField = typeof(Resources.Resources).GetField("resourceCulture",
BindingFlags.NonPublic | BindingFlags.Static);
innerField.SetValue(null, CultureInfo.CurrentUICulture);
感谢您的解决方案,这是一个比接受的答案更好的解决方案,它有太多的缺点。