1

私は次のことをしたい: Web.config にスイッチを追加し、それがオンになると、.resx ファイルからの値が元の .resx ファイルの名前と共に表示されるようにします。これは主にデバッグ用です。

私の現在の理解では、これを行う方法は、カスタム T4 テンプレートを作成し、PublicResXFileCodeGenerator.

が行うことを行うテンプレートを見つけて、PublicResXFileCodeGeneratorそれに基づいて構築しようとしています。インストールした Visual Studio のどこかにそのようなテンプレートはありますか? そうでない場合、オンラインの公式ソースからそのようなテンプレートを見つけることができますか?

4

1 に答える 1

3

Visual Studio は StronglyTypedResourceBuilder クラスを使用して、.resx ファイルを "ハード コーディングされた" リソースに変換します。そのため、Visual Studio インストールのどこかに同様の T4 テンプレートはないと思います。

独自の T4 テンプレートを作成することもできます。あなたの場合にすぐに使用できるテンプレートはありませんが、文字列リソースのデフォルトのリソースビルダーを開始して置き換える方法は次のとおりです。

  1. リソース ファイルのプロパティ グリッドの CustomTool-Property から "ResXFileCodeGenerator" を削除します。
  2. 既存の .Designer.cs ファイルを削除します
  3. 設定「DebugResources」を web.config に追加します。
  4. T4 テンプレート内の .resx ファイルを XDocument として開きます (.resx は xml 形式です)。

    <#@ assembly name="System.Xml" #>
    <#@ assembly name="System.Xml.Linq #>
    <#@ import namespace="System.Xml.Linq #>
    
    <#
       string inputFile = System.IO.Path.GetDirectoryName(this.Host.TemplateFile)
                        + @"\MyResourceFile.resx";
       XDocument resDoc = XDocument.Load(inputFile);
    #>
    
  5. .resx ファイル内のすべての要素を反復処理し、リソースのプロパティを生成します。web.config の設定に応じて、リソース ファイル名を戻り値に追加します。

    <#
        foreach(var dataElement in resDoc.Descendants("data")
                                         .Where(elem => elem.Attribute("type") == null)
        {
    #>
        public static string <#= dataElement.Attribute("name").Value #> {
          get {
            return ResourceManager.GetString("<#= dataElement.Attribute("name").Value #>")
                   + ((bool.Parse(ConfigurationManager.AppSettings["DebugResources"])) 
                     ? " (MyResourceFile.resx)" 
                     : String.Empty);
    <#
        }
    #>
    
  6. 残りのリソース クラスであるリソース マネージャー (元の Designer.cs ファイルからコピーできます) を生成し、画像やその他のリソース タイプの処理方法を確認します。

このアイデアがお役に立てば幸いです。いつか、完全で再利用可能な .tt を思い付くことができるかもしれません。

于 2013-01-31T12:37:32.087 に答える