2011-07-29 178 views
9

想象一下,您正在開發一個由數百個程序集組成的.Net 4.0項目,每個程序集都有自己的用於本地化的資源文件(.resx)。通過使用ResXFileCodeGenerator(創建一個「ResourceFile.Designer.cs」文件)自動生成的類從C#訪問本地化的字符串:string test = ResourceFile.TestString;如何繼承資源文件(resx)

每個程序集都有本地化的字符串,它們是特定的,但有字符串是所有組件通用。您告訴自己,如果資源密鑰在「本地」資源文件中不可用,那麼在「父」資源文件中包含這些「常用字符串」會很好,在這種情況下代碼將會退回。你然後說:「嘿!繼承可以在這裏工作。」事實上,在自動生成的設計器文件中做這樣的事情確實有效: internal class ResourceFile : ParentResourceFile 也就是說,在ResourceFile中未定義的字符串,但在ParentResourceFile中定義的字符串仍可以用ResourceFile.StringInParentFile訪問。

但一些在設計文件頭的麻煩你:「更改此文件可能會導致不正確的行爲,並將會丟失,如果重新生成代碼。」另外,你知道在自動生成的設計文件播放是皺起眉頭。所以你來這裏,你問:

  • 什麼時候ResXFileCodeGeoderator生成/重新生成設計器 類?
  • 有沒有辦法關閉自動生成?
  • 我們是否有 放棄ResXFileCodeGenerator的優勢並實施我們的 自己對ResourceManager的處理?

而你說「謝謝」。

回答

5

在調查了一段時間後,我已經解決了一個解決方法:不是繼承資源文件本身,而是繼承需要訪問「父」資源的類。

你只需要有一個基類,其項目包括一個「主」資源文件,該資源文件的CustomTool屬性設置爲PublicResXFileCodeGenerator(「公共」部分是很重要的,因爲它會創建一個public類,反對internal之一)。其中一個限制是PublicResXFileCodeGenerator只能從VS2008開始使用(這個CodeProject article可能會有幫助)。

然後,在需要訪問「主」資源類,只需從基類繼承和訪問這樣的資源:

這種解決方案
public class ChildClass : BaseClass 
{ 
    string test = BaseClass.BaseResourceFile.TestString; // a common resource 
    string localResource = ResourceFile.OtherString;  // a local resource 
} 

一個缺點是,你必須明確地引用BaseResourceFile訪問那裏定義的資源;如果繼承是在Resource類之間直接完成的,那麼就不會有後退到父類的情況。

和對子孫後代的,我會回答我自己的問題:

  • 什麼時候ResXFileCodeGenerator生成/再生設計師 類?

    每當資源被添加/刪除/修改。

  • 有沒有辦法關閉自動生成?

    不,不管怎樣,沒有自動生成的「代碼生成器」工具都是沒用的,你不覺得嗎?

  • 我們是否必須放棄ResXFileCodeGenerator的優勢並實施我們的 自己對ResourceManager的處理?

    不,請參閱上面的答案。

我們還考慮推行使用「鏈接」文件的解決方案(從「添加現有項目」對話框中,使用「添加爲鏈接」選項)其中的一個父resource文件將被鏈接到我們的所有組件,但由於我們的程序集已經從基類繼承,所以繼承方式似乎更好。

我真的不太願意接受我自己的答案,所以如果有人提出更好的解決方案或改進我的解決方案,我很樂意接受。也就是說,如果有人在乎。

+0

這沒有爲我工作......你是如何使它可以調用「BaseClass.BaseResourceFile.TestString」? – Denis