ResXFileCodeGenerator - 覆盖输出(想要使用自定义ResourceManager)

时间:2016-03-14 12:38:17

标签: c# visual-studio resx

我创建了一个继承自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,但是在这方面我们真的看不出有什么不同。

3 个答案:

答案 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); 

感谢您的解决方案,这是一个比接受的答案更好的解决方案,它有太多的缺点。