Класс поиска использует перечисление, структуру, общедоступную константу, что-то еще?

Я создаю класс поиска, поэтому во всех проектах будет использоваться постоянное значение. Дело в том, что есть несколько решений для создания такой штуки. Я мог бы создать один класс с перечислениями, структурами или константами или создать один класс для каждого «объекта». Мне интересно, что было бы лучшим решением.

Сначала я подумал сделать что-то вроде этого:

public static class Defines
    {
        public enum PAGELAYOUT_NAMES
        {
            STANDARD = "Standard"
        }
    }

Но лично мне не очень нравится использовать строки в перечислениях. Другим вариантом было бы использование структуры, что еще более уродливо, если вы видите код:

public static class Defines
    {
        public struct PAGELAYOUT_NAMES
        {
            public static string STANDAARD = "Standaard";
        }
    }

Это выглядит немного лучше, но может сбивать с толку при наличии большого количества вариантов:

public static class Defines
{
        public const string PAGELAYOUT_NAMES_STANDARD = "Standard";
}

Набирая этот пост, я думаю, что это будет лучший/чистый вариант:

public static class PageLayout
{
    public const string STANDARD = "Standard";
}

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

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

Окончательное реализованное решение Благодаря приведенным ниже предложениям я реализовал классы поиска следующим образом:

 internal class Base<T>
    {
        internal T Value{ get; private set;}
        internal Base(T value)
        {
            Value = value;
        }
    }
    public class PageLayout
    {
        public static string Standard { get { return new Base<string>("Standard").Value; } }
    }

Это основано на ответе, приведенном ниже. Причина в том, что теперь я могу использовать это также для не строк и целых чисел, что на самом деле невозможно с перечислением с описанием и файлом ресурсов, хотя мне это кажется более чистым.


person Jan_V    schedule 29.11.2010    source источник


Ответы (4)


Я предпочитаю использовать статические свойства заводского стиля. Но это зависит от конкретного сценария. Вы можете использовать строку или перечисление в качестве поля.

 public class PageLayout
    {
        private readonly string LayoutType;
        private PageLayout(string layoutType)
        {
          LayoutType = layoutType;
        }
        public static Standard {get {return new PageLayout("Standard");}}
    }

Затем в вызывающем коде используйте PageLayout.Standard

person softveda    schedule 29.11.2010
comment
Несмотря на то, что мне нравится чистота предложения Иэна Галлоуэя, я реализовал его, потому что вы также можете добавлять нестроковые и целые значения, такие как Guids, DateTime и т. д. - person Jan_V; 30.11.2010

В зависимости от того, что именно вы делаете, вы, вероятно, захотите посмотреть Ресурсы.

Вы определяете файл xml (или используете конструктор, чтобы помочь вам), и он компилируется в сборку (либо встроенную, либо «вспомогательную сборку»).

Щелкните правой кнопкой мыши узел свойств в библиотеке классов в обозревателе решений, нажмите «Открыть» и перейдите на вкладку ресурсов. Начать оттуда довольно просто.

После настройки легко получить значения из кода, например: -

String s = Resources.PageLayoutNames.Standard;

Есть несколько сложностей, но, не зная больше о вашем приложении, я не могу посоветовать больше. Первое, что приходит на ум, это то, что если вы выполняете модульное тестирование приложений ASP.NET, вам необходимо убедиться, что ресурс встраивается, а не развертывается как сателлит, иначе модульные тесты не будут работать.

Они также используются для глобализации, поэтому хорошо с ними ознакомиться.


Изменить:

Поочередно, прочитав ваш вопрос еще раз, я склонен спросить: «Зачем вам вообще нужна строка?».

Что вы делаете, что вы не можете сделать только с перечислением?

enum PageLayouts
{
  Standard,
  ExtraAwesome
}

Если вы пытаетесь сопоставить текст для отображения с типом перечисления, существует множество способов сделать это, например. с помощью атрибута Description

enum PageLayouts
{
   [Description("Standard")]
   Standard,
   [Description("Extra Awesome")]
   ExtraAwesome
}

Однако вы не можете дать DescriptionAttribute ключ ресурса из коробки. Вы должны создать подкласс, если хотите поддерживать глобализацию. .

person Iain Galloway    schedule 29.11.2010

Люди советуют не использовать общедоступные вложенные классы, поэтому в ваших предыдущих примерах Defines должно быть пространством имен, а не внешним классом.

person ChrisW    schedule 29.11.2010

я всегда использую

public static class PageLayout 
{ 
    public const string STANDARD = "Standard"; 
} 

подход.

Однако я создаю больше классов, чем один: когда я использую много переменных сеанса, я создаю (общедоступный статический)

class SessionNames

И я делаю разницу между общими константами души и общими константами проекта.

иногда константы для одного проекта (например, 20 заполнителей в PDF-файле, который вы должны создать) не имеют ничего общего с другими проектами, поэтому я делаю это классом проекта, но когда у меня есть широкие константы решения, я создаю класс в том же месте как я добавляю свои строковые расширения и т. д.

person Michel    schedule 29.11.2010
comment
Вы должны быть очень осторожны, если используете константные значения. Они компилируются как литералы в ссылающиеся сборки. Это означает, что при изменении значения константы вам необходимо перекомпилировать все ваши dll, а не только ту, которая содержала измененную константу. См. примечание здесь: - msdn.microsoft.com/en-us/library/ ms173119.aspx - person Iain Galloway; 29.11.2010