2

Visual Studio 2010 resx フレームワークが気に入りました。同じ機能を持ちたいのですが、カスタム列を使用します。次の解決策を考えました:

  1. res.xml を一意のファイルとして定義して、リソース クラスを生成します。
  2. res.xml を保存するたびに、xml のフィールドを使用してリソース クラスを生成する独自のビジュアル スタジオ アドインを作成します。

例:

XML:

 <?xml version="1.0" encoding="utf-8"?>
 <resources>
   <field name="x" loggerLevel="Verbose"/>
   <field name="y" loggerLevel="Details"/>
 </resources>

コードに変換:

class Resources{
   public readonly Field x = new Field(LoggerLevel.Verbose);
   public readonly Field y = new Field(LoggerLevel.Details);
}

問題は、私がここで殺し過ぎているかどうかです。私の目標を達成するためのより簡単な解決策はありますか?

編集: xml を修正しました。

4

1 に答える 1

3

単純な T4 テンプレートで十分な場合があり、T4 は既に MSVS に組み込まれています。XML をプロジェクトに追加し (XML が有効であること、現在の XML の例が無効であることを確認してください)、T4 テンプレートを XML ファイルと同じプロジェクト ディレクトリに追加します。名前空間名と XML ファイル名は自由に編集してください (サンプル コードでは、名前空間に「T4Example」、入力ファイル名に「Example.xml」を使用しています)。

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="System.Xml.dll" #>
<#@ assembly name="System.Xml.Linq.dll" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Xml.Linq" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".cs" #>

namespace T4Example
{
    class Fields
    {
    <#  
        string stringsDir = Path.GetDirectoryName(this.Host.TemplateFile);
        string reswFile = Path.Combine(stringsDir, @"Example.xml");
        var doc = XDocument.Load(reswFile);
        var data = doc.Element("xml")
                      .Element("fields")
                      .Elements("field")
                      .Select(i => Tuple.Create(
                            i.Attribute("name").Value,
                            i.Attribute("loggerLevel").Value));
        foreach(var tuple in data)
        {#>
        public readonly Field <#=tuple.Item1#> = new Field(LoggerLevel.<#=tuple.Item2#>);
<#      }#>
    }
}
于 2012-10-14T13:35:23.457 に答える