3

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.

我可以尝试获取所有不同的可能性,或者其他人有解决问题的方法吗?

4

1 回答 1

1

为此,您必须创建自定义代码生成器,因为 Visual Studio 会为您生成资源。生成的类是静态的、不可扩展的,并且与使用 Resx 的 .NET ResourceManager 非常紧密地耦合。

您可以通过创建自定义强类型资源生成器并在 Visual Studio 中替换它来更改此设置。Visual Studio 使用ResXFileCodeGeneratorand PublicResXFileCodeGenerator,或者您可以创建一个独立的工具来运行项目中的所有 Resx 文件并生成自定义强类型资源类。

如果您想了解如何执行此操作,可以查看Westwind.Globalization,其中包含一个StronglyTypedResources类,该类仅用于为数据库资源(或 Resx)创建强类型类。您可以获取该代码并对其进行修改以生成满足您需要的自定义类。

也就是说,我认为动态不是你想要的。而是可以创建 Getter,使它们实现您要执行的逻辑。例如,我喜欢确保如果找不到资源,则始终返回某些内容 - 绝不是 null 或空白值。因此,如果缺少资源,我会返回资源 ID,这总比没有好。

于 2015-03-19T00:27:33.113 回答