2011-12-01 158 views
8

我想從Resources.Designer.cs文件中覆蓋System.Resources.ResourceManager以實現自定義的ResourceManager.GetString(...)方法功能。這可能嗎?如何覆蓋Resources.Designer.cs中的默認System.Resources.ResourceManager?

+0

你可以包裝ResourceManager而不是覆蓋它嗎? – Filip

+0

是的,我可以。我想獲得的是自定義的ResourceManager.GetString(...)功能。 –

+0

然後將它包裝在自定義類中,並在該類的GetString方法中執行所有額外的工作。 – Filip

回答

2

我相信你在這裏問兩個單獨的問題。你當然可以覆蓋ResourceManager.GetString。但是,您不能在自動生成的Resource.Designer.cs代碼中使用該覆蓋。要使用它,你必須編寫你自己的Resource設計師課程。

public class MyResourceManager : System.Resources.ResourceManager 
    { 
    // override 
    public override GetString(string name) 
     { 
     // custom code 
     } 
    } 

public class MyResourceDesigner 
    { 
     // use your custom class with override 
     private static MyResourceManager resourceManager; 
     private static CultureInfo resourceCulture; 

     public static MyResourceManager ResourceManager 
     { 
      if (object.ReferenceEquals(resourceManager, null)) 
       { 
        // Resource is just the name of the .resx file 
        // be sure to include relevant namespaces 
        var temp = new MyResourceManager(
        "MyProject.Resource", 
        typeof(MyResourceDesigner).Assembly); 
        resourceManager = temp; 
       } 

      return resourceManager; 
     } 

     public static CultureInfo Culture 
     { 
     get 
     { 
      return resourceCulture; 
     } 

     set 
     { 
      resourceCulture = value; 
     } 
     } 

     // start adding strongly-typed objects 
     public static string Foo 
     { 
     get 
     { 
      // use your override 
      return ResourceManager.GetString("Foo", resourceCulture); 
     } 
     } 
    } 
+0

這並不意味着完整,但它缺少一個'class'關鍵字。請儘量讓你的批評具有建設性。 – Kjata30

3

我創建了一個CustomResourceManager,它覆蓋GetString()調用像這樣:

public class CustomResourceManager : ResourceManager 
{ 
    public CustomResourceManager(Type resourceSource) 
     :base(resourceSource) 
    { 
    } 

    public CustomResourceManager(string baseName, Assembly assembly) 
     : base(baseName, assembly) 
    { 
    } 

    public CustomResourceManager(string baseName, Assembly assembly, Type usingResourceSet) 
     : base(baseName, assembly, usingResourceSet) 
    { 
    } 

    public override string GetString(string name) 
    { 
     // your business logic 
    } 

    public override string GetString(string name, CultureInfo culture) 
    { 
     // your business logic 
    } 
} 

然後我在生成加入了預生成步驟,我的項目替換System.Resources.ResourceManager的創建與我CustomResourceManagerResource.Designer.cs file:

powershell -command "(gc ..\Resources\Resource.Designer.cs).Replace(\"new global::System.Resources.ResourceManager\", \"new CustomResourceManager\") | set-content ..\Resources\Resource.Designer.cs -Encoding UTF8" 

我們走吧!

+1

只要從代碼中使用資源,這很好用。當使用剃刀視圖中的資源時,似乎使用了原始生成的版本,而不是編譯的「已修改」版本。任何想法? – laureysruben

+0

自定義資源管理器正在從視圖中爲我調用。你的觀點是什麼樣子?我的示例如下所示: '@using My.Namespace.Resources' [new line] '

@ Resource.Foo

' – djs

+1

這似乎正是我們正在做的,但它仍然不起作用。當我們檢查視圖中的資源指向的位置是在這個App_GlobalResources.gecvukmg.dll中,而不是在設計器代碼文件中。 因此,似乎在編譯的App_GlobalResources.gecvukmg.dll中未使用生成的(並且被操縱的)設計器代碼文件。 – laureysruben