在我们的应用程序中,Resources.designer.cs
文件中有1000个静态属性的使用。例如:
Resources.string_to_identify_the_resource
我们也有自己的类来查找资源,但也允许从其他程序集中覆盖资源。如果我们有一个想要重命名插件或产品的客户,这很有用,因为我们只需要输入一个dll并完成它。这个类的用法如下:
Resources.GetString("string_to_identify_the.resource");
我们希望通过我们自己的Resources类查找所有资源,以便可以覆盖它们,并且我的任务是执行此操作。我不想看到并重新分解所有代码。
我最初的想法是使用自定义DynamicObject:
public class Resources
{
public static dynamic Dynamic = new StaticResourcesDynamicObject();
class StaticResourcesDynamicObject : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = GetString(binder.Name);
return true;
}
}
// Existing code to lookup resources
public static string GetString(string name)
{
...
}
}
所以
Resources.string_to_identify_the_resource
将简单地重命名为:
Resources.Dynamic.string_to_identify_the_resource
主要问题是许多资源名称包含句点(.
),因此它们与静态属性不匹配。例如,Cmd.Too_Much
的静态属性为Cmd_Too_Much
。
我可以尝试获取所有不同的可能性,或者其他人是否有解决问题的方法?
答案 0 :(得分:1)
为此,您必须创建自定义代码生成器,因为Visual Studio会为您生成资源。生成的类是静态的,不可扩展,并且非常紧密地耦合到与Resx一起使用的.NET ResourceManager。
您可以通过创建自定义强类型资源生成器并在visual studio中替换它来更改此设置。 Visual Studio使用ResXFileCodeGenerator
和PublicResXFileCodeGenerator
,或者您可以创建一个独立的工具来运行项目中的所有Resx文件,并生成自定义的强类型资源类。
如果您想了解如何执行此操作,可以查看Westwind.Globalization,其中包含StronglyTypedResources
类,该类可用于为数据库资源(或Resx)创建强类型类。您可以获取该代码并对其进行修改以生成满足您需要的自定义类。
那说我认为动态不是你想要的。相反,可以创建Getters,使它们实现您想要执行的逻辑。例如,我想确保如果找不到资源,则始终返回某些内容 - 永远不会为null或空值。因此,如果资源丢失,我返回的资源ID优于空。