2011-12-01 139 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