是否可以在不使用ResourceManager的情况下使用.resx文件动态创建伪资源?

时间:2015-05-14 22:01:30

标签: c# .net localization resourcemanager

我的项目中有一个资源文件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时返回假伪字符串。主要目的是我不想仅仅为了测试目的而生成虚假的物理资源文件。

1 个答案:

答案 0 :(得分:1)

当然可以。你了解ResourceManager是如何运作的吗?有多种方法可以实现您的目标。一对夫妇是这些:

ONE OPTION :查看资源文件背后的代码。它告诉您需要在某个阶段创建ResourceManager的实例。一种方法是提供资源类型的名称(也称为基本名称)以及可以在其中找到它的程序集。照着做!这将使您意识到您还需要动态的资源类型(类) - 所以这样做:在创建ResourceManager的实例之前创建一种资源类型。该类型需要具有要检索的伪字符串名称的公共属性。这里给出了一个如何执行此操作的示例:Stackoverflow: Dynamically create a class in C#

另一个选项:熟悉模拟框架的工作原理,例如Moq。您可以对伪造资源类型应用相同的想法。因此,不是动态创建资源类型,而是可以使用资源模拟来教导返回_fake stri