2016-03-14 1 views
1

J'ai créé une classe héritant de ResourceManager. Mon problème est que si je change mon Resources.Designer.cs pour l'utiliser,ResXFileCodeGenerator - redéfinir la sortie (voulez utiliser un ResourceManager personnalisé)

par exemple.

private static global::System.Resources.ResourceManager _resourceManager; 

à

private static global::MyProject.Resources.MyResourceManager _resourceManager; 

il est écrasé par le ResXFileCodeGenerator et remis à la valeur par défaut System.Resources.ResourceManager.

Je ne souhaite pas désactiver le ResXFileCodeGenerator. Mais est-il possible de dire quelle classe utiliser?

On m'a dit de regarder ResXFileCodeGeneratorEx mais je ne peux pas vraiment voir comment cela est différent à cet égard.

Répondre

0

j'ai réussi à atteindre cet objectif en utilisant T4

https://msdn.microsoft.com/en-us/library/bb126445.aspx

permet essentiellement la génération de code automatique de la manière qui fait ResXFileCodeGenerator. Ce n'est pas une solution parfaite, car il a fallu beaucoup de travail pour répliquer la fonctionnalité de ResXFileCodeGenerator et aussi il ne s'exécute pas automatiquement chaque fois que le fichier .resx est enregistré sans avoir à installer un autre outil personnalisé Visual Studio Je vais devoir donner pour faire installer tous les développeurs sur le projet.

2

Un peu tardif mais en utilisant la réflexion, vous pouvez résoudre ce problème. J'ai mis ce code dans le fichier Startup.cs.

var innerField = typeof(Resources.Resources).GetField("resourceMan", 
    BindingFlags.NonPublic | BindingFlags.Static); 

if (innerField != null) 
{ 
    innerField.SetValue(null, 
     new ExtendedResourceManager("MyNamespace.ResourceFileWithoutResx", 
      typeof(Resources.Resources).Assembly)); 
} 

Parce que le concepteur fichier généré est là pour tout voir, modifier simplement le code que je l'ai écrit à partir des ResourceManager {get; } code généré pour vous.

Vous pouvez créer votre propre classe ExtendedResourceManager et remplacer toutes les propriétés comme vous le souhaitez.

Bonne codification.

0

@ James Woodall: Je devais changer votre code un peu pour le faire fonctionner avec le fichier de langue correcte:

var innerField = typeof(Resources.Resources).GetField("resourceMan", 
BindingFlags.NonPublic | BindingFlags.Static); 

innerField.SetValue(null, 
    new ExtendedResourceManager("MyNamespace.ResourceFileWithoutResx", 
     typeof(Resources.Resources).Assembly)); 

innerField = typeof(Resources.Resources).GetField("resourceCulture", 
BindingFlags.NonPublic | BindingFlags.Static); 

innerField.SetValue(null, CultureInfo.CurrentUICulture); 

Nous vous remercions de solution, qui est AMHA une solution beaucoup mieux que la réponse acceptée , qui a trop d'inconvénients.