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);
感谢您提供解决方案,恕我直言,这是一个比接受的答案要好得多的解决方案,后者有太多缺点。
我创建了一个 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);
感谢您提供解决方案,恕我直言,这是一个比接受的答案要好得多的解决方案,后者有太多缺点。