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?
Assembly assembly = this.GetType().Assembly;
ResourceManager resourceManager = new ResourceManager("Resources.Strings", Assembly);
string myString = resourceManager.GetString("value");
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 .
string val = Resources.ResourceManager.GetString("resource_name");
"resource_name"
étant donné, vous pouvez récupérer la valeur de la ressource.
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");
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.
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.
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);