2013-01-25 161 views
1

我想要執行以下操作:在我的Web.config中添加一個開關,並且每當它打開時,來自.resx文件的任何值都將與其出現的.resx文件的名稱一起顯示從。這主要是爲了調試目的。用於PublicResXFileCodeGenerator的T4模板

我目前的理解是,要做到這一點的方法是創建一個自定義的T4模板,並用它代替PublicResXFileCodeGenerator

我正在試圖找到一個模板,它可以完成PublicResXFileCodeGenerator所做的工作,然後在此基礎上進行構建。我的Visual Studio安裝中是否有這樣的模板?如果沒有,我可以從官方網站上找到這樣的模板嗎?

回答

2

Visual Studio使用StronglyTypedResourceBuilder類將.resx文件轉換爲「硬編碼」資源。這就是爲什麼我不認爲在Visual Studio安裝中有一個類似的T4模板。

您可能想要創建自己的T4模板。我沒有準備好使用的模板,你的情況,但這是我會怎樣開始和替換默認的資源建設者字符串資源:在資源文件的屬性網格

  1. 刪除「ResXFileCodeGenerator」從CustomTool-物業。
  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文件。

+1

謝謝妮可。我希望有一種方法可以在設計器文件中使用我可以從ResourceManager派生的CustomResourceManager替換所有System.Resources.ResourceManager。也許我可以運行我將包含在構建中的腳本。 – Panos

+0

嗯,我同意,刪除所有.designer.cs文件可能會很耗時,而且可能會忘記刪除一些文件。 但是對於構建過程,ResourceManager類所在的文件無關緊要。 看看這裏:http://stackoverflow.com/q/14607395/1990914,這可能會讓你實際上替換設計器文件的內容。 – Nico