【问题标题】:Determine if a resource exists in ResourceManager判断资源是否存在于 ResourceManager
【发布时间】:2008-10-01 22:18:49
【问题描述】:

是否有办法确定 ResourceManager 是否包含命名资源?目前我正在捕捉 MissingManifestResourceException 但我讨厌必须在非异常情况下使用异常。必须有某种方法可以通过反射或其他方式枚举 ResourceManager 的名称值对?

编辑:更详细一点。资源不在执行程序集中,但是 ResourceManager 工作得很好。如果我尝试_resourceMan.GetResourceSet(_defaultCuture, false, true) 我会得到空值,而如果我尝试_resourceMan.GetString("StringExists") 我会得到一个字符串。

【问题讨论】:

    标签: c# resources


    【解决方案1】:

    您可以使用 ResourceSet 来执行此操作,如果您枚举它,它只会将所有数据加载到内存中。来吧:

        // At startup.
        ResourceManager mgr = Resources.ResourceManager;
        List<string> keys = new List<string>();
    
        ResourceSet set = mgr.GetResourceSet(CultureInfo.CurrentCulture, true, true);
        foreach (DictionaryEntry o in set)
        {
            keys.Add((string)o.Key);
        }
        mgr.ReleaseAllResources();
    
        Console.WriteLine(Resources.A);
    

    【讨论】:

    • 当我尝试从 ResourceManager 获取 ResourceSet 时,我返回 null。
    • 好的,我让它工作了,但我必须先尝试加载单个资源,然后才能调用 GetResourceSet。奇怪。
    【解决方案2】:

    我认为您可以使用 Assembly.GetManifestResourceNames 之类的东西来枚举大会清单中可用的资源列表。它并不漂亮,也不能解决所有极端情况,但如果需要,它可以工作。

    【讨论】:

    • 返回一个零字符串数组。
    • 资源是卫星资源吗?
    • 您给他的是 ResourceManager 名称,而不是那些 ResourceManager 中的资源名称;)。
    • 有趣的是,我曾使用它来获取组件旁边的资源,而不是资源管理器。即 Project\Resources\Image.jpg -> Assembly.GetManifestresourceNames 将返回 Project.Resources.Image.jpg。这不是他想要的吗?
    • 是的,资源在卫星资源中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    相关资源
    最近更新 更多