C # - самый быстрый способ получить строку ресурса из сборки - PullRequest
20 голосов
/ 24 января 2012

Я действительно не знаю / не знаю ответа, знания, чтобы найти значение ресурса, используя ключ из файла resx в сборке, используя c #. (Или, может быть, я не знаю).

Какой код был бы самым быстрым, если бы я мог получить string values или values, используя ключ из файла ресурсов, который встроен как ресурс в сборку. Я храню дружественные сообщения об исключениях в файле ресурсов и хотел бы использовать их при необходимости.

Существует ли для этого статический класс?

Существуют ли зрелые проекты с открытым исходным кодом, которые я могу использовать для этого?

Ответы [ 7 ]

39 голосов
/ 29 мая 2013

Если ресурс находится в той же сборке, что и код, тогда будет делать следующее:

String resourceValue = MyAssemblyNameSpace.Properties.Resources.ResourceName

Взято из этого SO ответа .

19 голосов
/ 24 января 2012
Assembly assembly = this.GetType().Assembly;
ResourceManager resourceManager = new ResourceManager("Resources.Strings", assembly);
string myString = resourceManager.GetString("value");
9 голосов
/ 16 октября 2013
string val = Resources.ResourceManager.GetString("resource_name");

Учитывая "resource_name", вы можете получить значение ресурса.

4 голосов
/ 24 января 2012

вы можете использовать ResourceManger для получения строкового значения из сборки

Получить ресурс из сборки

ResourceManager ResManager= new ResourceManager("yourResource", 
            Assembly.GetExecutingAssembly());
String strResourveValue = ResManager.GetString("YourStringKey");
2 голосов
/ 08 июля 2013

Когда я сделал новый проект для своих модульных тестов библиотеки классов типа C # под названием UnitTests, я щелкнул правой кнопкой мыши и добавил новый ресурс. Я назвал это UnitTestsResources. Я добавил 2 строки к этому ресурсу. После этого я смог легко получить к ним доступ, как это

UnitTestsResources.NoDeviceRequireMsg

Мне было любопытно, как это работает, поэтому я поднял код за файлом ресурсов, и это имеет смысл. Visual Studio сделал внутренний класс со статическими средствами доступа. Для меня это выглядит так

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

Так как это только для моих модульных тестов, я доволен этим. Надеюсь, это поможет кому-то еще.

1 голос
/ 16 мая 2017
 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 голос
/ 29 июля 2013

Чтобы улучшить ответ Герцбуба, я покажу, как я это реализовал ..

Вместо того, чтобы создавать проекты или папки для файла ресурсов, просто щелкните правой кнопкой мыши свой проект и выполните add-> new item, затем выберите файл ресурсов. Откройте флешку ресурсов в ваших строках, сохраните как полезное имя и перейдите к C #, где вы хотите их использовать, тогда это просто:

String resourceValue = MyProjectName.MyResourceFileName.MyResourceRowItem;

Если это не работает, обратите внимание на выпадающий список модификатора доступа в вашем файле resx.

...