Как использовать «жестко запрограммированный» словарь / перечисление - PullRequest
0 голосов
/ 03 февраля 2020

Я хочу создать «словарь» строк, однако я только когда-либо узнал, как использовать строки для ссылки на то, что я хочу в словаре. Я хочу что-то с более автоматическим исправлением (поскольку опечатки могут произойти в большой таблице строк), поэтому я хочу знать, как жестко кодировать. (Значение строк будет получено из текстового файла, например JSON).

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

Итак вместо того, чтобы делать:

string result = strings["Hello"];

Я sh, чтобы сделать это:

string result = strings.Hello;

Единственное, о чем я могу думать, - это использовать какой-нибудь внешний инструмент, который создает enum / struct скрипт со значениями из текстового файла. Есть ли лучший вариант, возможно, встроенный. NET?

Редактировать: я думаю, что "строго типизированный" был бы лучшим описанием по сравнению с "жестко закодированным".

Редактировать 2 Спасибо за все комментарии и ответы. Судя по всему, для генерации этого результата требуется некоторый код. Интересно, есть ли уже какие-нибудь инструменты, которые делают это для вас (я пытался искать, но моей терминологии может не хватать). Создание этого инструмента не кажется слишком сложным.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Есть константы времени компиляции и константы времени выполнения .

Ваш wi sh для поддержки Autocrrection / Intellisense требует константы времени компиляции. Это единственные Intellisence, подсветка синтаксиса и двойная проверка компилятора.

Но ваше требование иметь значения, сгенерированные из стороннего текстового файла, указывает либо на константу времени выполнения, либо на некоторую автоматизированную c генерацию кода , Константы времени выполнения убрали бы поддержку редактора. В то время как генерация кода будет иметь проблемы с редактором, имеющим только старую копию файла. И высокий риск взлома тонны кода при изменении строки в этом одном файле.

Таким образом, ваши два требования по своей сути противоречат друг другу. Вам нужно иметь свой торт и есть его тоже.

Возможно, моё простое решение проблемы Enum / ToString () могло бы вам помочь?

Перечисление для большинства частей группы констант и целые по умолчанию. С добавленными проверками типов на назначениях. Это делает их хорошим способом обойти Primitive Obsession . Вы ссылаетесь на значение из группы так же, как на любое постоянное, поле readonly stati c или свойство readonly. (Есть и другие преимущества, такие как флаги, но я сомневаюсь, что они имеют значение здесь).

Хотя в Enums есть строка, которую вы можете использовать для отображения и анализа ввода - та, которую вы используете в исходном коде - эта абсолютно не подходит для отобразить. По умолчанию это все заглавные буквы, и вам потребуется поддержка Localization. Моим примитивным решением был слой перевода. Я добавляю Dictionary<someEnum, String> SomeEnumStringRepresentation. Этот словарь может быть сгенерирован и даже изменен во время выполнения:

  • Мне нужно отобразить любое заданное значение c, это SomeEnumLocalisation[someEnum]. Я мог бы добавить поведение по умолчанию просто к ToString () представлению компилятора Enum.
  • Мне нужно проанализировать ввод пользователя? Перебирайте значения, пока не найдете совпадение, если не выбросите ParseException.
  • Я использую проверки времени компиляции. Без необходимости иметь дело с очень неизменными компилируемыми боковыми строками где-либо еще. Или с моим кодом боковые строки меняются все время.
0 голосов
/ 03 февраля 2020

Я не совсем понимаю, чего вы хотите, но я просто привожу здесь идею - как насчет расширения строки класса и добавления к ней ваших собственных методов? поэтому, когда вы используете строки. Здравствуйте, он вернет, что вы хотели?

пример: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...