Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/55: Рейтинг темы: голосов - 55, средняя оценка - 4.65
1 / 1 / 0
Регистрация: 14.09.2018
Сообщений: 40

Подобие Enum для String

14.09.2018, 13:58. Показов 11432. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня, уважаемые форумчане!
Имеем некоторую сущность "Properties":
C#
1
2
3
4
5
6
7
class Props
    {
        public string name;
        public ObjectType objectType = new ObjectType();
        public enum ObjectType : short { book = 0, dog = 1, building = 2};
 
    }
присваивание значений мне очень нравится, получается некий "справочник" (не знаю как на языке кодеров сишарпа он кошерно называется, пусть меня закидают навозом и палками):
C#
1
props.objectType = Props.ObjectType.dog;
хочу таким же способом выбирать из перечисления строковое значение

C#
1
2
public PropType propType = new PropType();
public ??? PropType : ?string? {"red", "green", "blue"};
знаю что enum оперирует только числами и представляет их строковые синонимы, но мне в итоге хочется видеть чтото похожее на

C#
1
2
3
Console.WriteLine(props.propType());
//не критично можно даже так: 
Console.WriteLine(props.propType);
Которое вернет к примеру
C#
1
red
ввиду недостаточности знаний прошу пнуть в какую нибудь сторону)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.09.2018, 13:58
Ответы с готовыми решениями:

Преоброзование из Enum в string
Здраствуйте! Пожалуйста помогите.. Нужно преобразовать перечесление в string формат public class Library { public...

Вывод Enum в метод String
я новичек так сказать, учу сам, поэтому банальный вопрос как сделать вывод через метод String, поля Enum Days. выделю место где не знаю...

Привести string к enum
Здравствуйте, мне нужно привести переменную типа string к enum, на такую запись enum_var =...

14
 Аватар для andrey_f
884 / 537 / 228
Регистрация: 21.02.2011
Сообщений: 5,705
14.09.2018, 14:01
Dictionary
1
 Аватар для Wolflind
127 / 107 / 31
Регистрация: 17.03.2016
Сообщений: 445
Записей в блоге: 1
14.09.2018, 14:15
а что мешает просто класс создать статический с константами?

Добавлено через 2 минуты
если не нужен русский то те же enum хотя туда можно и русские слова вписать
но это не есть хорошо
0
1 / 1 / 0
Регистрация: 14.09.2018
Сообщений: 40
14.09.2018, 14:42  [ТС]
мешает недостаток знаний, я уже говорил, просьба не язвить.
за наводку спасибо
0
 Аватар для Wolflind
127 / 107 / 31
Регистрация: 17.03.2016
Сообщений: 445
Записей в блоге: 1
14.09.2018, 15:16
Лучший ответ Сообщение было отмечено judipav как решение

Решение

я использовал типа этого там было чуть по лучше сделано к сожалению где это использовал не помню
но примерно так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class GrainType
{
    private string _typeKeyWord;
 
    private GrainType(string typeKeyWord)
    {
        _typeKeyWord = typeKeyWord;
    }
 
    public override string ToString()
    {
        return _typeKeyWord;
    }
 
    public static GrainType Wheat = new GrainType("GT_WHEAT");
    public static GrainType Corn = new GrainType("GT_CORN");
    public static GrainType Rice = new GrainType("GT_RICE");
    public static GrainType Barley = new GrainType("GT_BARLEY");
 
}
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
14.09.2018, 16:10
Цитата Сообщение от judipav Посмотреть сообщение
знаю что enum оперирует только числами...
Это не совсем так. Enum хранит и цифры, и названия своего списка. Просто основное (по умолчанию?) свойство выдаёт цифру. Название можно получить тоже.

Добавлено через 4 минуты
Вот при мер из моего приложения
C#
1
2
3
4
5
6
7
8
9
        /// <summary>Возвращает значение Status</summary>
        private string _Status { get => CommonCode.XValue(_ParentXML, "Status"); }
        /// <summary>Перечисление допустимых значений для Status</summary>
        public enum StatusSubItem { Undefined = 0, Enabled = 1, Disabled = 2 }
 
        /// <summary>Возвращает значение Status</summary>
        public StatusSubItem Status => Enum.TryParse(_Status, out StatusSubItem _enum) ? _enum : StatusSubItem.Undefined;
        /// <summary>Возвращает строковое значение Status</summary>
        public string StatusString => Status.ToString();
Добавлено через 2 минуты
CommonCode.XValue моя функция - возвращает сохранённое в XML текстовое значение перечисления.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
14.09.2018, 16:18
enum и так в строку конвертируется при вызове ToString()
C#
1
Console.WriteLine("{0} {1}", ObjectType.book, (int)ObjectType.book);
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
14.09.2018, 16:33
Цитата Сообщение от Someone007 Посмотреть сообщение
enum и так в строку конвертируется при вызове ToString()
Да, а обратно из строки методом Enum.TryParse
0
1 / 1 / 0
Регистрация: 14.09.2018
Сообщений: 40
08.10.2018, 10:53  [ТС]
Цитата Сообщение от Wolflind Посмотреть сообщение
я использовал типа этого там было чуть по лучше сделано к сожалению где это использовал не помню
но примерно так
то что нужно! спасибо!

Не по теме:

отвлекся на месяц на другие задачи)...



Добавлено через 8 минут
Цитата Сообщение от Wolflind Посмотреть сообщение
я использовал типа этого там было чуть по лучше сделано к сожалению где это использовал не помню
но примерно так
Мозг не может осознать инициализацию объектов класса из самого класса... Что это? Рекурсивный вызов? Для меня это чтото из разряда загадки курицы и яйца, не знаю как сказать. Ткните куда обратиться чтобы заполнить пробел в знаниях? Имею ввиду хотябы название этого финта ушами, или раздел в какойто книге?
0
 Аватар для Wolflind
127 / 107 / 31
Регистрация: 17.03.2016
Сообщений: 445
Записей в блоге: 1
16.04.2019, 12:11
judipav,
Цитата Сообщение от judipav Посмотреть сообщение
финта ушами, или раздел в какойто книге?
сам где-то нашел.
Элд Хасп, Someone007,
для строк мо жет и да но, а если туда нужно забить на русском? или текст? или вообще набор неизвестного изначально типа?
Подобный подход позволит это реализовать, a enum напрямую нет. Нужен опять же какой то словарь дополнительный для хранения значений. И если я не ошибаюсь примерно так и реализован enum.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
16.04.2019, 13:47
Цитата Сообщение от Wolflind Посмотреть сообщение
И если я не ошибаюсь примерно так и реализован enum.
В джаве.

Кстати, сделайте объявленные поля readonly, а то как-то не комильфо
0
 Аватар для Wolflind
127 / 107 / 31
Регистрация: 17.03.2016
Сообщений: 445
Записей в блоге: 1
16.04.2019, 13:58
kolorotur, я имею в виду что enum это по сути класс который посахарен
и при компиляции он преобразуется к обычному классу
https://habr.com/ru/post/178763/ пункт 9
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
16.04.2019, 14:12
Цитата Сообщение от Wolflind Посмотреть сообщение
enum это по сути класс который посахарен и при компиляции он преобразуется к обычному классу
Это же деталь реализации конкретного компилятора (какого, кстати?).
Спек языка не накладывает каких-то условий на то, как перечисления должны быть интерпретированы компилятором: он может делать структуру, как в примере по ссылке, а может тупо подменять перечисления числовыми константами — это полностью отдано на его усмотрение, главное чтобы он учитывал правила их поведения.
В отличие от джавы, где в спецификации языка конкретно указывается, что enum должен быть реализован через класс.

Через это фраза "в шарпе enum — посахаренный класс" применительно к языку не совсем корректна.
Как деталь реализации конкретного компилятора — вполне, но не как общее правило языка.
0
2810 / 1679 / 885
Регистрация: 14.04.2015
Сообщений: 5,723
16.04.2019, 14:56
вот пример самого перечисления:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
    public enum EFileInvoice
    {
        [EnumValue("Ожидает загрузки")]
        Waiting = 1,
 
        [EnumValue("В обработке")]
        Execute,
 
        [EnumValue("Обработан")]
        Done,
 
        [EnumValue("Ошибка получения файлов")]
        ErrorExec,
 
        [EnumValue("Ошибка загрузки файлов")]
        ErrorDone,
 
        [EnumValue("Ошибка выверки файлов")]
        ErrorAlignment
    }
}
дальше получаем значение и обрабатываем:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class DescriptionValues
    {
        public static string GetStringValue(Enum EValue)
        {
            string Output = null;
 
            Type Type = EValue.GetType();
 
            FieldInfo fi = Type.GetField(EValue.ToString());
 
            EnumValue[] AttrEnum =
               fi.GetCustomAttributes(typeof(EnumValue), false) as EnumValue[];
            if (AttrEnum.Length > 0)
            {
                Output = AttrEnum[0].Value;
            }
            return Output;
        }
    }
 
 public class EnumValue : System.Attribute
    {
        private readonly string ValueTask;
 
        public EnumValue(string Description)
        {
            ValueTask = Description;
        }
 
        public string Value
        {
            get { return ValueTask; }
        }
    }
вывод поля enum в скобках получаем таким образом:
C#
1
Console.WriteLine(DescriptionValues.GetStringValue(EFileInvoice.Done)); // результат в консоли: Обработан
1
 Аватар для Wolflind
127 / 107 / 31
Регистрация: 17.03.2016
Сообщений: 445
Записей в блоге: 1
16.04.2019, 15:15
Добавлено через 15 секунд
AndreyVorobey, не плохой вариант но как по мне излишняя сложность где можно обойтись без нее
и вызов метода самого класса выглядит красивее чем отдельного
да можно метод расширения но опять же еще сложной код, еще и будит мешается где не нужно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.04.2019, 15:15
Помогаю со студенческими работами здесь

SetValue string to enum
Всем привет! На сайте для отображения новостей имеется фильтр, по нажатию кнопок должны отобразиться различного характера новости, фильтр...

Получение строки из R.string в коде enum
Доброго времени суток. Есть FragmentPagerAdapter, который получает фрагменты из enum. Сейчас код enum выглядит так: public enum...

Оптимизировать написание кода при string => enum
Есть некий класс, в котором: public: virtual void InitClip(string state, Clip* clip) { if (state == &quot;Idle&quot;) { ...

Маппинг enum в string (EntityFramework) или свой строковый тип
Уважаемые, требуется совет. Есть сущность: public class Entity { public Guid Id { get; set; } } К этой...

Обобщения, где в качестве параметра enum (класс наследник Enum)
Хочу создать такой класс: public class Example &lt;Y extends Enum&gt; { ... } А потом: enum Ex { a, b, c; } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru