Ответ 1
Assembly assembly = this.GetType().Assembly;
ResourceManager resourceManager = new ResourceManager("Resources.Strings", assembly);
string myString = resourceManager.GetString("value");
Я действительно не знаю/имею ответ, знание, чтобы найти значение ресурса, используя ключ из файла resx
в сборке с использованием С#. (или, может быть, я не осведомлен).
Каким будет самый быстрый код, я могу получить string values
или values
с помощью ключа из файла ресурсов, который встроен как ресурс в сборку. Я сохраняю дружественные сообщения для исключений в файле ресурсов и хотел бы использовать их при необходимости.
Существует ли для этой цели статический класс?
Есть ли проекты с открытым исходным кодом, которые я могу использовать для этого?
Assembly assembly = this.GetType().Assembly;
ResourceManager resourceManager = new ResourceManager("Resources.Strings", assembly);
string myString = resourceManager.GetString("value");
Если ресурс находится в той же сборке, что и код, то будет выполнено следующее:
String resourceValue = MyAssemblyNameSpace.Properties.Resources.ResourceName
Взято из этого SO-ответа.
string val = Resources.ResourceManager.GetString("resource_name");
Учитывая "resource_name"
, вы можете получить значение ресурса.
вы можете использовать ResourceManger для получения строкового значения из Assembly
ResourceManager ResManager= new ResourceManager("yourResource",
Assembly.GetExecutingAssembly());
String strResourveValue = ResManager.GetString("YourStringKey");
Когда я создал новый проект для модульных тестов библиотеки классов типа С# под названием 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);
}
}
}
Поскольку это только для моих модульных тестов, я доволен этим. Надеюсь, это поможет кому-то другому.
Чтобы улучшить ответ на herzbube, я покажу, как я это сделал.
Вместо создания проектов или папок для файла ресурсов просто щелкните правой кнопкой мыши ваш проект и добавьте- > новый элемент, затем выберите файл ресурсов. Откройте палку ресурсов в ваших строках, сохраните как полезное имя и перейдите на С#, где вы хотите их использовать, тогда это просто:
String resourceValue = MyProjectName.MyResourceFileName.MyResourceRowItem;
Если это не работает, обратите внимание на модификатор доступа, когда он находится внутри вашего файла 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);