2012-09-25 107 views
3

在我們的應用程序中,在Resources.designer.cs文件中有1000個靜態屬性的用法。例如:用DynamicObject替換靜態資源屬性

Resources.string_to_identify_the_resource 

我們也有我們自己的類,它查找資源,而且還可以讓資源從其他組件覆蓋。如果我們有一個客戶想要重命名插件或產品,這非常有用,因爲我們只需要放入一個dll並完成它。該類用於像:

Resources.GetString("string_to_identify_the.resource"); 

我們希望所有的資源,通過我們自己的資源類中擡起頭來,使他們能夠重寫,我一直負責做這個。我不喜歡所有的代碼並重新考慮因素。

我最初的想法是使用自定義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的靜態屬性。

我可以嘗試獲取所有不同的可能性,或者其他人是否有解決該問題的方法?

回答

1

爲了做到這一點,您必須創建自定義代碼生成器,因爲Visual Studio會爲您生成資源。生成的類是靜態的,不可擴展的,並且與Resx一起使用的.NET ResourceManager非常緊密。

您可以通過創建自定義強類型資源生成器並在Visual Studio中替換該更改。 Visual Studio使用ResXFileCodeGeneratorPublicResXFileCodeGenerator,或者您可以創建一個獨立工具來運行項目中的所有Resx文件並生成自定義強類型資源類。

如果您想了解如何做到這一點,您可以查看Westwind.Globalization其中包含StronglyTypedResources類,該類僅爲數據庫資源(或Resx)創建強類型類。您可以將該代碼修改並生成自定義類,以滿足您的需求。

這就是說我認爲動態不是你想要的。而是可以創建Getters,以便他們實現您想要執行的邏輯。例如,我想確保如果找不到資源,總是返回 - 永遠不會返回空值或空值。因此,如果缺少資源,我會返回比沒有任何資源更好的資源ID。