ResXFileCodeGenerator - 覆盖输出(想要使用自定义资源管理器)

ResXFileCodeGenerator - overriding the output (want to use a Custom ResourceManager)

我创建了一个 class 继承自 ResourceManager。我的问题是,如果我将 Resources.Designer.cs 更改为使用它,

例如

private static global::System.Resources.ResourceManager _resourceManager;

private static global::MyProject.Resources.MyResourceManager _resourceManager;

它被 ResXFileCodeGenerator 覆盖并设置回默认值 System.Resources.ResourceManager

我不想关闭 ResXFileCodeGenerator。但是有什么方法可以告诉它使用哪个 ResourceManager class 吗?

我被告知要查看 ResXFileCodeGeneratorEx,但看不出它在这方面有何不同。

我使用 T4 成功实现了这个

https://msdn.microsoft.com/en-us/library/bb126445.aspx

基本上允许以 ResXFileCodeGenerator 的方式自动生成代码。

这不是一个完美的解决方案,因为它只是复制 ResXFileCodeGenerator 的功能需要做很多工作,而且它不会自动 运行 每次保存 .resx 文件而无需安装另一个Visual Studio 我必须提供的自定义工具才能让项目中的所有开发人员安装。

有点迟了,但使用反射可以解决这个问题。我把这段代码放在 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 class 并根据需要覆盖所有属性。

编码愉快。

@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); 

感谢您提供解决方案,恕我直言,这是一个比接受的答案要好得多的解决方案,后者有太多缺点。