web-dev-qa-db-fra.com

C # - Le moyen le plus rapide d'obtenir une chaîne de ressources d'un assemblage

Je ne sais vraiment pas/n'ai pas la réponse, la connaissance pour trouver une valeur de ressource en utilisant une clé d'un fichier resx dans une assemblée utilisant c #. (Ou peut-être que je suis ignorant).

Quel serait le code le plus rapide, comme je peux récupérer string values ou values en utilisant une clé d'un fichier de ressources qui est incorporé en tant que ressource dans un assemblage. Je stocke des messages conviviaux pour les exceptions dans le fichier de ressources et souhaite les utiliser en cas de besoin.

Existe-t-il une classe statique à cet effet?

Existe-t-il des projets matures open source que je peux utiliser pour cela?

20
Deeptechtons
Assembly assembly = this.GetType().Assembly;
ResourceManager resourceManager = new ResourceManager("Resources.Strings", Assembly);
string myString = resourceManager.GetString("value");
19
sblom

Si la ressource est dans la même assemblée que le code, les opérations suivantes suffiront:

String resourceValue = MyAssemblyNameSpace.Properties.Resources.ResourceName

Extrait de cette SO réponse .

39
herzbube
string val = Resources.ResourceManager.GetString("resource_name");

"resource_name" étant donné, vous pouvez récupérer la valeur de la ressource.

9
SurenSaluka

vous pouvez utiliser ResourceManger pour obtenir la valeur de chaîne de Assembly 

Obtenir des ressources de l'Assemblée

ResourceManager ResManager= new ResourceManager("yourResource", 
            Assembly.GetExecutingAssembly());
String strResourveValue = ResManager.GetString("YourStringKey");
4
Ravi Gadag

Lorsque j'ai créé un nouveau projet pour mes tests unitaires de la bibliothèque de classe de type C # appelée UnitTests, j'ai cliqué avec le bouton droit de la souris et ajouté une nouvelle ressource. J'ai nommé cela UnitTestsResources. J'ai ajouté 2 chaînes à cette ressource. J'ai ensuite pu facilement y accéder comme ceci

UnitTestsResources.NoDeviceRequireMsg

J'étais curieux de savoir comment cela fonctionnait, alors j'ai tiré le code derrière le fichier de ressources et c'est logique. Visual Studio a créé une classe interne avec des accesseurs statiques .. Cela ressemble à ceci pour moi

[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class UnitTestsResources {

    //Some auto generated code

    /// <summary>
    ///   Looks up a localized string similar to OPOS Device is required for test.
    /// </summary>
    internal static string DeviceRequireMsg {
        get {
            return ResourceManager.GetString("DeviceRequireMsg", resourceCulture);
        }
    }

    /// <summary>
    ///   Looks up a localized string similar to OPOS Device must not be installed for test.
    /// </summary>
    internal static string NoDeviceRequireMsg {
        get {
            return ResourceManager.GetString("NoDeviceRequireMsg", resourceCulture);
        }
    }
}

Comme ce n’est que pour mes tests unitaires, je me contente de cela. J'espère que ça aide quelqu'un d'autre.

2
Robert Snyder

Pour améliorer la réponse de herzbube, je vais montrer comment j'ai implémenté ceci.

Plutôt que de créer des projets ou des dossiers pour le fichier de ressources, cliquez avec le bouton droit de la souris sur votre projet et ajoutez-> nouvel élément, puis choisissez le fichier de ressources. Ouvrez le fichier de ressources dans vos chaînes, enregistrez-le sous un nom utile et naviguez jusqu'au C # où vous souhaitez les utiliser. Il suffit ensuite de:

String resourceValue = MyProjectName.MyResourceFileName.MyResourceRowItem;

Si cela ne fonctionne pas, faites attention au menu déroulant du modificateur d'accès lorsque vous vous trouvez dans votre fichier resx.

1
Chris
 var thread = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
            var culture = new CultureInfo(thread);
            var resourceManager = new ResourceManager(typeof(Resources.Resource));
            string value = resourceManager.GetString(name, culture);
1
Anup Shetty