使用动态文件名从资源文件(resx)中读取存储的字符串

10
我需要在我的C#应用程序中为每个客户创建一个自定义的字符串.resx文件。我想要做的是避免每次提供应用程序给客户时都重新编译整个项目,因此我需要动态访问这个字符串。那么,在应用程序执行期间,如果只知道文件名,如何访问.resx文件呢?目前我写的代码类似于:
Properties.Resources.MyString1

Resource是我的Resource.resx文件,但我需要像这样的内容:

GetStringFromDynamicResourceFile("MyFile.resx", "MyString1");

有可能吗?

谢谢 马克


好的Prashanth,它起作用了!唯一的问题是“Func”方法不能是“静态”的,否则编译器会抛出异常。谢谢大家... - Mark
4个回答

13

类似这样的东西会对你有所帮助吗?

Dictionary<string, string> resourceMap = new Dictionary<string, string>();

public static void Func(string fileName)
{
    ResXResourceReader rsxr = new ResXResourceReader(fileName);        
    foreach (DictionaryEntry d in rsxr)
    {
        resourceMap.Add(d.Key.ToString(),d.Value.ToString());           
    }        
    rsxr.Close();
}

public string GetResource(string resourceId)
{
    return resourceMap[resourceId];
}

4
最好使用 "using" 语句来包装 ResXResourceReader,而不是显式关闭读取器。 - arbiter
我想我在这里偶然发现了代码(演示2):http://www.c-sharpcorner.com/UploadFile/yougerthen/105262008135822PM/1.aspx - Ben Clark-Robinson

2
你可以将所需的资源放入单独的 DLL 中(每个客户一个),然后使用 Reflection 动态提取资源:
Assembly ass = Assembly.LoadFromFile("customer1.dll");
string s = ass.GetManifestResource("string1");

可能我的语法有误 - 这是很早之前的事了。这里存在一个潜在的注意事项:通过反射访问DLL将锁定该DLL文件一段时间,这可能会阻止您更新或替换客户机上的DLL。


1

当然可以。您需要阅读有关 msdn 中 ResouceSet 类的信息。如果您想直接加载 .resx 文件,可以使用 ResxResourceSet


0
在您的项目中,使用LINQ to SQL而不是引用System.Windows.Forms.ResXResourceReader类。
public string GetStringFromDynamicResourceFile(string resxFileName, string resource)
{
    return XDocument
                .Load(resxFileName)
                .Descendants()
                .FirstOrDefault(_ => _.Attributes().Any(a => a.Value == resource))?
                .Value;
}

并使用它:

GetStringFromDynamicResourceFile("MyFile.resx", "MyString1");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接