2011-12-01 3 views
8

Desidero sovrascrivere System.Resources.ResourceManager dal file Resources.Designer.cs per ottenere la funzionalità del metodo ResourceManager.GetString (...) personalizzato. È possibile?Come eseguire l'override di default System.Resources.ResourceManager in Resources.Designer.cs?

+0

È possibile avvolgere ResourceManager invece di sovrascriverlo? – Filip

+0

Sì, posso. Tutto quello che voglio ottenere è la funzionalità personalizzata di ResourceManager.GetString (...). –

+0

Quindi basta avvolgerlo in una classe personalizzata e fare tutto il lavoro extra nel metodo GetString di quella classe. – Filip

risposta

2

Credo che stai facendo due domande separate qui. Puoi certamente ignorare lo ResourceManager.GetString. Tuttavia, non è possibile utilizzare tale override nel codice Resource.Designer.cs generato automaticamente. Per utilizzarlo, dovrai scrivere la tua classe di designer 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

Non è pensato per essere completo, anche se manca una parola chiave 'class'. Cerca di rendere le tue critiche costruttive, per favore. – Kjata30

3

ho creato un CustomResourceManager che sostituisce le GetString() chiamate in questo modo:

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

poi ho aggiunto una fase di pre-build per il mio progetto per sostituire la creazione di un System.Resources.ResourceManager con la mia CustomResourceManager nel generato 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" 

E via!

+1

Funziona alla grande, purché le risorse vengano utilizzate dal codice. Quando si utilizzano le risorse dalle visualizzazioni del rasoio, sembra che venga utilizzata la versione generata originale invece della versione "adattata" che è stata compilata. Qualche idea? – laureysruben

+0

Il gestore risorse personalizzato viene chiamato dalla vista per me. Che aspetto ha la tua vista? Il mio esempio assomiglia a questo: '@using My.Namespace.Resources' [nuova riga] '

@ Resource.Foo

' – djs

+1

Questo sembra essere esattamente quello che stiamo facendo, ma ancora non funziona. Quando controlliamo dove le risorse nella vista puntano finiamo in questo App_GlobalResources.gecvukmg.dll e non nel file di codice del designer. Quindi sembra che il file di codice di progettazione generato (e manipolato) non sia utilizzato nella App_GlobalResources.gecvukmg.dll compilata utilizzata dalla vista. – laureysruben