Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
899
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Преобразование enums в удобочитаемые значения
Кто-нибудь знает, как преобразовать значение enum в читаемое человеком значение?
Например:
ThisIsValueA должно быть "This is Value A".
Преобразование этого фрагмента кода vb, который некий Иэн Хорвилл оставил в своем блоге давным-давно ... с тех пор я успешно использовал это в производстве.
/// <summary>
/// Add spaces to separate the capitalized words in the string,
/// i.e. insert a space before each uppercase letter that is
/// either preceded by a lowercase letter or followed by a
/// lowercase letter (but not for the first char in string).
/// This keeps groups of uppercase letters - e.g. acronyms - together.
/// </summary>
/// <param name="pascalCaseString">A string in PascalCase</param>
/// <returns></returns>
public static string Wordify(string pascalCaseString)
{
Regex r = new Regex("(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])");
return r.Replace(pascalCaseString, " ${x}");
}
(требует использования System.Text.RegularExpressions;')
Таким образом:
Console.WriteLine(Wordify(ThisIsValueA.ToString()));
Будет возвращаться,
"This Is Value A".
Это гораздо проще и менее избыточно, чем предоставление атрибутов описания.
Атрибуты полезны здесь только в том случае, если вам нужно обеспечить уровень косвенности (который не был задан в вопросе).
.ToString на Enums относительно медленно в C#, сопоставимо с GetType().Name (он может даже использовать это под одеялом).
Если ваше решение должно быть очень быстрым или высокоэффективным, вам лучше всего кэшировать свои конверсии в статическом словаре и искать их оттуда.
Небольшая адаптация кода @Leon's для использования преимущества C#3. это действительно имеет смысл как расширение enums - вы можете ограничить его конкретным типом, если не хотите загромождать все из них.
public static string Wordify(this Enum input)
{
Regex r = new Regex("(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])");
return r.Replace( input.ToString() , " ${x}");
}
//then your calling syntax is down to:
MyEnum.ThisIsA.Wordify();
Большинство примеров этого, которые я видел, включают маркировку ваших значений перечисления с помощью атрибутов [Description] и использование отражения для выполнения "conversion" между значением и описанием. Вот старая запись в блоге об этом:
http://geekswithblogs.net/rakker/archive/2006/05/19/78952.aspx
Вы можете наследовать от "Attribute" класса System.Reflection, чтобы создать свой собственный "Description" класс. Вот так (отсюда ):
using System;
using System.Reflection;
namespace FunWithEnum
{
enum Coolness : byte
{
[Description("Not so cool")]
NotSoCool = 5,
Cool, // since description same as ToString no attr are used
[Description("Very cool")]
VeryCool = NotSoCool + 7,
[Description("Super cool")]
SuperCool
}
class Description : Attribute
{
public string Text;
public Description(string text)
{
Text = text;
}
}
class Program
{
static string GetDescription(Enum en)
{
Type type = en.GetType();
MemberInfo[] memInfo = type.GetMember(en.ToString());
if (memInfo != null && memInfo.Length > 0)
{
object[] attrs = memInfo[0].GetCustomAttributes(typeof(Description), false);
if (attrs != null && attrs.Length > 0)
return ((Description)attrs[0]).Text;
}
return en.ToString();
}
static void Main(string[] args)
{
Coolness coolType1 = Coolness.Cool;
Coolness coolType2 = Coolness.NotSoCool;
Console.WriteLine(GetDescription(coolType1));
Console.WriteLine(GetDescription(coolType2));
}
}
}
Вы также можете взглянуть на эту статью: http://www.codeproject.com/KB/cs/enumdatabinding.aspx
Он специально посвящен привязке данных, но показывает, как использовать атрибут для украшения значений перечисления и предоставляет метод "GetDescription" для извлечения текста атрибута. Проблема с использованием встроенного атрибута описания заключается в том, что существуют другие виды использования/пользователи этого атрибута, поэтому существует вероятность того, что описание появится там, где вы этого не хотите. Пользовательский атрибут решает эту проблему.
Альтернативой добавлению атрибутов Description в каждое перечисление является создание метода расширения. Чтобы повторно использовать перечисление Adam "Coolness":
public enum Coolness
{
NotSoCool,
Cool,
VeryCool,
SuperCool
}
public static class CoolnessExtensions
{
public static string ToString(this Coolness coolness)
{
switch (coolness)
{
case Coolness.NotSoCool:
return "Not so cool";
case Coolness.Cool:
return "Cool";
case Coolness.VeryCool:
return "Very cool";
case Coolness.SuperCool:
return Properties.Settings.Default["SuperCoolDescription"].ToString();
default:
throw new ArgumentException("Unknown amount of coolness", nameof(coolness));
}
}
}
Хотя это означает, что описания находятся дальше от фактических значений, это позволяет использовать локализацию для печати различных строк для каждого языка, например, в Примере my VeryCool .