2012-01-24 61 views
17

Realmente no sé/tengo la respuesta, el conocimiento para encontrar un valor de recurso usando una clave de un archivo resx en un ensamblado usando C#. (O puede ser que soy ignorante)C# - La forma más rápida de obtener cadena de recursos del ensamblado

¿Cuál puede ser el código de manera más rápida, lo que puedo recuperar string values o values utilizando una clave de un archivo de recursos que es incrustado como recurso en un ensamblaje. Estoy almacenando mensajes amigables para excepciones en el archivo de recursos y me gustaría usarlos cuando sea necesario.

¿Existe una clase estática para este propósito?

¿Hay proyectos maduros de código abierto que pueda usar para esto?

Respuesta

18
Assembly assembly = this.GetType().Assembly; 
ResourceManager resourceManager = new ResourceManager("Resources.Strings", assembly); 
string myString = resourceManager.GetString("value"); 
+3

Hola, gracias por el código. ¿No emplea la lin1 la reflexión? qué tan eficiente puede ser esto. – Deeptechtons

+1

@Deeptechtons, sí, sorta. De hecho, no creo que GetType().La asamblea es lenta, pero incluso si lo es, presumiblemente lo harías una vez al principio de tu programa. La idea es que ocultes 'resourceManager' en algún lugar del objeto principal de tu aplicación o algo así y solo úsala cuando necesites una cadena. – sblom

+0

¿Un ensamblaje proporciona eventos al principio del ciclo de vida, de modo que cuando se produce una excepción, solo tengo que recuperar la cadena en lugar de crear una instancia cada vez. – Deeptechtons

4

puede utilizar ResourceManger para obtener el valor de la cadena de Asamblea

Get Resource from Assembly

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

Si el recurso está en la misma Asamblea que el código, a continuación, la siguiente hará:

String resourceValue = MyAssemblyNameSpace.Properties.Resources.ResourceName 

Tomado de this SO answer.

+0

Simplemente una manera más fácil de pasar por este resourceManager-thing. Gracias. – C4u

1

Cuando hice un nuevo proyecto para mis pruebas unitarias de la biblioteca de clases de tipo C# llamada UnitTests, hice clic derecho y agregué un nuevo recurso. Llamé a UnitTestsResources. Agregué 2 cadenas a ese recurso. Yo era entonces capaz convenientemente acceder a ellos de esta manera

UnitTestsResources.NoDeviceRequireMsg

tenía curiosidad de cómo eso funcionó, así que se detuvo el código detrás del archivo de recursos y tiene sentido. Visual Studio hizo una clase interna con descriptores de acceso estáticas .. Parece que este para mí

[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); 
     } 
    } 
} 

Dado que es sólo para mi unidad pruebas me contento con esto. Espero que ayude a alguien más.

1

Para mejorar la respuesta de Herzbube voy a mostrar cómo he implementado este ..

En lugar de crear proyectos o carpetas para el archivo de recursos, basta con hacer clic derecho su proyecto y no Agregar-> nuevo elemento, a continuación, seleccione el archivo de recursos . Abra el archivo de recursos en sus cadenas, guárdelo como un nombre útil y navegue hasta C# donde desee usarlos, entonces es simplemente:

Cadena resourceValue = MyProjectName.MyResourceFileName.MyResourceRowItem;

Si eso no funciona, preste atención al menú desplegable del modificador de acceso cuando se encuentre dentro de su archivo resx.

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

Dado "resource_name" puede recuperar el valor del recurso.

+1

Perfecto ..... !!! –

1
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); 
+0

¡Esa es la que estaba buscando! Siempre trato de evitar cadenas como los demás constructores de ResourceManager. – madannes

Cuestiones relacionadas