如何在不捕获MissingManifestResourceException的情况下知道是否找不到资源文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在不捕获MissingManifestResourceException的情况下知道是否找不到资源文件相关的知识,希望对你有一定的参考价值。

我的.resx文件位于我的应用程序的每个客户端的不同命名空间中。说Resources.FirstClient.Home.resxResources.SecondClient.Home.resx。大多数字符串对于每个客户端都是通用的,所以我想引入一个默认的命名空间Resources.Default.Home.resx,如果找不到客户端的字符串,我可以使用它。

我遇到的问题是我不知道如何确定是否找不到资源文件。 (例如Resources.ThirdClient.Home.resx不存在所以我想用"Resources.Default.Home.resx代替)

现在,我发现处理它的唯一方法是捕获引发的MissingManifestResourceException

var resourceManager = new ResourceManager("Resources.ThirdClient.Home", typeof(ResourceFactory).Assembly);

string str;
try
{
    str = resourceManager.GetString("myString");
}
catch(MissingManifestResourceException e)
{
    resourceManager = new ResourceManager("Resources.DefaultClient.Home", typeof(ResourceFactory).Assembly);
    str = resourceManager.GetString("myString");
}

有没有更好的方法来了解资源文件是否丢失?

答案

我们最终在应用程序启动时加载ResourceManager实例并将它们保存在Singleton实例中,然后在尝试获取字符串时使用这些实例。

首先,我们将资源管理器加载到字典字典中,第一个键是客户端名称,第二个键是资源文件的名称(例如:resourceManagers["ThirdClient"]["Home"])。我们在_tenants列表中也有一个默认值:

var resourceManagers = new Dictionary<string, IDictionary<string, IResourceManagerAdapter>>();

foreach (var tenant in _tenants)
{
    var resourceDictionnary = typeof(ResourceFactory)
        .Assembly
        .GetTypes()
        .Where(t => t.IsClass && t.Namespace == "Resources." + tenant)
        .ToDictionary<Type, string, ResourceManager>
             (resourceFile => resourceFile.Name,
              resourceFile => new ResourceManager("Resources." + tenant + "." + resourceFile.Name, typeof(ResourceFactory).Assembly));

    resourceManagers.Add(tenant, resourceDictionnary);
}

我们将resourceManagers字典保存在使用DI容器注入我们服务的单例实例中。

然后我们使用注入的字典来获取字符串,如果找不到则使用默认值:

public string GetString(string classKey, string resourceKey)
{
    if (!resourceManagers.ContainsKey(client) || !resourceManagers[client].ContainsKey(classKey))
        return resourceManagers[default][classKey].GetString(resourceKey);

    return resourceManagers[client][classKey].GetString(resourceKey, _cultureService.GetCurrentCulture())
        ?? resourceManagers[default][classKey].GetString(resourceKey);
}

从我们所做的测试来看,这种方法比在每个ResourceManager上使用新的try catchGetString快约1000倍。

以上是关于如何在不捕获MissingManifestResourceException的情况下知道是否找不到资源文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在不点击的情况下从 Chrome 自定义标签中捕获 URL?

如何在不损失视网膜显示质量的情况下将 UIView 捕获到 UIImage

如何在不向用户显示视图的情况下捕获整个滚动视图的图片

如何在不使用输入元素的情况下捕获 Vuejs 中的任何按键事件

如何在不将 onscroll 处理程序附加到每个容器的情况下捕获页面上的所有滚动事件

如何在不调整窗口大小的情况下使用 Java 在 Selenium Webdriver 中捕获屏幕截图 [重复]