2011-12-01 8 views
8

Quiero sobrescribir System.Resources.ResourceManager del archivo Resources.Designer.cs para lograr la funcionalidad del método ResourceManager.GetString (...) personalizada. es posible?¿Cómo sobrescribir System.Resources.ResourceManager predeterminado en Resources.Designer.cs?

+0

¿Se puede ajustar ResourceManager en lugar de anularlo? – Filip

+0

Sí puedo. Todo lo que quiero obtener es la funcionalidad personalizada ResourceManager.GetString (...). –

+0

Luego simplemente envuélvalo en clase personalizada y haga todo el trabajo adicional en el método GetString de esa clase. – Filip

Respuesta

2

Creo que estás haciendo dos preguntas por separado aquí. Sin duda puede anular ResourceManager.GetString. Sin embargo, no puede usar esa anulación en el código autogenerado Resource.Designer.cs. Para usarlo, tendrá que escribir su propia clase de diseñador 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

No está destinado a ser completo, aunque le falta una palabra clave 'clase'. Intente hacer su crítica constructiva, por favor. – Kjata30

3

he creado un CustomResourceManager que anula los GetString() llamadas así:

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 
    } 
} 

Luego añade una etapa de pre-construcción de mi proyecto para reemplazar la creación de un System.Resources.ResourceManager con mi CustomResourceManager en el generada Resource.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" 

Y vamos, vamos!

+1

Esto funciona muy bien, siempre que los recursos se utilicen desde el código. Al usar recursos de vistas de maquinilla de afeitar parece que se está utilizando la versión generada original en lugar de la versión "adaptada" que se compila. ¿Alguna idea? – laureysruben

+0

El administrador de recursos personalizado se llama desde la vista por mí. ¿Cómo se ve tu vista? Mi ejemplo se ve así: '@using My.Namespace.Resources' [línea nueva] '

@ Resource.Foo

' – djs

+1

Eso parece ser exactamente lo que estamos haciendo, pero todavía no funciona. Cuando verificamos dónde apuntan los recursos en la vista, terminamos en este App_GlobalResources.gecvukmg.dll y no en el archivo de código del diseñador. Parece que el archivo de código de diseñador generado (y manipulado) no se usa en el App_GlobalResources.gecvukmg.dll compilado utilizado por la Vista. – laureysruben

Cuestiones relacionadas