Класс поиска использует enum, struct, public const, что-то еще? - PullRequest
5 голосов
/ 29 ноября 2010

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

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

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; } }
    }

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

Ответы [ 4 ]

4 голосов
/ 29 ноября 2010

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

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

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

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

String s = Resources.PageLayoutNames.Standard;

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

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


Редактировать:

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

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

enum PageLayouts
{
  Standard,
  ExtraAwesome
}

Если вы пытаетесьсопоставить текст для отображения с типом enum. Существует множество способов сделать это, например, с использованием атрибута DescriptionAttribute

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

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

2 голосов
/ 29 ноября 2010

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

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

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

0 голосов
/ 29 ноября 2010

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

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

.

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

class SessionNames

И я действительно делаю различие между константами со всей душой и проектными константами.

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

0 голосов
/ 29 ноября 2010

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

...