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

本文关键字:一个 创建 资源 ResourceManager 有可能 resx 文件 是否 情况下 动态 | 更新日期: 2023-09-27 17:49:02

我有一个资源文件字符串。resx在我的项目中存储默认的英文字符串。出于测试目的,我又创建了一个文件strings.zh-CN。但是存储在那里的字符串不是真正的中文。它们只是在将一些字符附加到字符串中存储的字符串后生成的测试字符串。Resx(主资源文件)。当用户登录到zh-CN区域性时,该文件有助于捕获硬编码数据和未翻译的字符串。有没有可能去掉strings。zh-cn。当当前线程文化是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(或其他我不确定的东西)挂钩,并返回一个假的伪字符串,当文化是zh-CN。主要目的是我不想生成一个假的物理资源文件只是为了测试的目的。

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

当然可以。了解ResourceManager的工作原理吗?有多种方法可以实现你想要的。例如:

ONE OPTION:查看资源文件背后的代码。它告诉您需要在某个阶段创建ResourceManager的实例。这样做的一种方法是提供资源类型的名称(也称为基名)和可以在其中找到它的程序集。做同样的事!这将使您意识到,您还需要动态地创建一个资源类型(类)——因此请这样做:在创建ResourceManager的实例之前创建一个资源类型。该类型需要有一个公共属性,其名称为您想要检索的伪字符串。这里给出了一个例子:Stackoverflow:在c#中动态创建一个类。

另一个选项:熟悉模拟框架(如Moq)的工作方式。您可以将相同的思想应用于伪造资源类型。因此,与其在运行中创建资源类型不如使用资源模拟它可以被教导返回_fake stri

相关文章: