我的项目中有一个资源文件strings.resx,用于存储默认的英文字符串。出于测试目的,我创建了另一个文件strings.zh-CN.resx,但存储在那里的字符串不是真正的中文。它们只是在将一些字符附加到strings.resx(主资源文件)中存储的字符串后生成的测试字符串。当用户登录zh-CN文化时,此文件有助于捕获硬编码数据和未翻译的字符串。有可能我可以摆脱strings.zh-CN.resx文件并在当前线程文化为zh-CN时动态生成虚假资源吗?
基本上 - 有没有什么方法可以让ResourceManager在没有物理.resx文件的情况下为特定文化返回伪字符串?
我正在使用Visual Studio自动生成的designer.cs文件来获取资源。我可以在designer.cs文件中看到.resx文件中每个字符串都有一个静态属性。在designer.cs中初始化ResourceManager的方式如下。
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("xxx.xxx.Strings", typeof(Strings).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
这是自动生成代码添加静态属性的方式。
/// <summary>
/// Looks up a localized string similar to Absolute.
/// </summary>
public static string Absolute {
get {
return ResourceManager.GetString("Absolute", resourceCulture);
}
}
我正在寻找此检索中的扩展点。如果可能的话,我想挂钩我自己的自定义ResourceManager(或其他我不确定的东西)并在culture是zh-CN时返回假伪字符串。主要目的是我不想仅仅为了测试目的而生成虚假的物理资源文件。
答案 0 :(得分:1)
当然可以。你了解ResourceManager是如何运作的吗?有多种方法可以实现您的目标。一对夫妇是这些:
ONE OPTION :查看资源文件背后的代码。它告诉您需要在某个阶段创建ResourceManager
的实例。一种方法是提供资源类型的名称(也称为基本名称)以及可以在其中找到它的程序集。照着做!这将使您意识到您还需要动态的资源类型(类) - 所以这样做:在创建ResourceManager
的实例之前创建一种资源类型。该类型需要具有要检索的伪字符串名称的公共属性。这里给出了一个如何执行此操作的示例:Stackoverflow: Dynamically create a class in C#。
另一个选项:熟悉模拟框架的工作原理,例如Moq。您可以对伪造资源类型应用相同的想法。因此,不是动态创建资源类型,而是可以使用资源模拟来教导返回_fake stri