3

私たちのアプリケーションでは、ファイル内の静的プロパティが何千回も使用されていResources.designer.csます。例えば:

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 はResXFileCodeGeneratorPublicResXFileCodeGeneratorを使用します。または、プロジェクト内のすべての Resx ファイルを実行し、厳密に型指定されたカスタム リソース クラスを生成するスタンドアロン ツールを作成することもできます。

これを行う方法を知りたい場合は、データベース リソース (または Resx) の厳密に型指定されたクラスを作成するためのクラスを含むWestwind.Globalizationを参照してください。StronglyTypedResourcesそのコードを取得して変更し、必要なことを行うカスタム クラスを生成できます。

そうは言っても、動的はここで必要なものではないと思います。むしろ、実行したいロジックを実装するような方法でゲッターを作成できます。たとえば、リソースが見つからない場合は、常に何かが返されるようにしたいと考えています。null や空白の値は決して返されません。したがって、リソースが欠落している場合は、何もないよりはましなリソース ID を返します。

于 2015-03-19T00:27:33.113 に答える