在我们的应用程序中,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
的静态属性。
我可以尝试获得所有不同的可能性,或者其他人有解决问题的办法吗?
为了做到这一点,您必须创建一个自定义代码生成器,因为Visual Studio会为您生成资源。生成的类是静态的,不可扩展,并且与使用Resx的.NET ResourceManager紧密耦合。
您可以通过创建一个自定义的强类型资源生成器来改变这一点,并在visualstudio中替换它。Visual Studio使用ResXFileCodeGenerator
和PublicResXFileCodeGenerator
,或者您可以创建一个独立的工具,该工具运行在项目中的所有Resx文件中,并生成自定义的强类型资源类。
如果你想知道如何做到这一点,你可以看看Westwind.Globalization,它包括一个StronglyTypedResources
类,用于为数据库资源(或Resx)创建强类型类。您可以获取该代码并对其进行修改,以生成满足您需要的自定义类。
话虽如此,我认为这里的活力不是你想要的。相反,可以创建Getter,使其实现您想要执行的逻辑。例如,我喜欢确保如果找不到资源,总是返回something,而不是null或空白值。因此,如果资源丢失,我会返回资源Id,这总比什么都没有好。