Другой эквивалент enum? - PullRequest
       4

Другой эквивалент enum?

0 голосов
/ 04 августа 2011

Мне нравится использовать enum в качестве держателей значений везде, где это возможно, и мне это нравится. Это просто в использовании, то есть просто поставьте точку и посмотрите значения. Это хорошая замена жесткого кода некоторое время.

Но все же у него есть некоторые ограничения. Мы не можем помещать специальные символы в значения и некоторые другие.

На самом деле я пытаюсь сделать код многоразовым. Пожалуйста, ведите меня. Есть ли какой-то метод или способ, которым я могу использовать некоторую структуру данных, например enum, которая является гибкой, но не имеет ограничений.

Ответы [ 4 ]

6 голосов
/ 04 августа 2011

Вы можете использовать константы;они неизменны и могут иметь любую ценность.Смотрите также: http://msdn.microsoft.com/en-us/library/ms173119.aspx

4 голосов
/ 04 августа 2011

Если я не могу использовать перечисление для набора предопределенных значений, я использую класс статических констант.Они выглядят почти одинаково в использовании, но значения могут быть любыми, от десятичного до строкового, до структуры или классаЯ сделал это для предопределенных цветовых схем ячеек в GridViews, так же, как встроенный класс Color имеет предопределенные постоянные значения.Математические и научные константы, такие как e и Pi (если вы хотели, чтобы значения отличались от тех, которые предоставляются классом Math), или ускорение силы тяжести (9,8 м / с 2 ), или скорость света (299 792 458)m / s), также может быть указан следующим образом.

Если вы считаете, что не можете использовать Enums, потому что вам нужно хранить предопределенные строковые значения, попробуйте этот удобный прием, используя атрибут описания System.ComponentModel:

public Enum MyStrings
{
   [Description("This is string one")] StringOne,
   [Description("This is a different string")] StringTwo,
   ...
}

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

public static string GetDescription(this Enum enumValue)
    {
        object[] attr = enumValue.GetType().GetField(enumValue.ToString())
            .GetCustomAttributes(typeof (DescriptionAttribute), false);

        return (attr.Length > 0) 
            ? ((DescriptionAttribute) attr[0]).Description 
            : String.Empty;            
    }

Использование:

var stringOne = MyStrings.StringOne.GetDescription(); //"This is string one"

В этом случае вы также можете рассмотреть возможность использования файла ресурсов.Значение строки может быть изменено вне области программы без перекомпиляции.

1 голос
/ 04 августа 2011

Не уверен, что именно вам нужно (re: «специальные символы»), но вы можете просто использовать некоторые константы и поместить их в статический класс, например:

public static class MyConstants
{
    /// <summary>documentation here</summary>
    public const string ValueA = "somevalue";
    /// <summary>documentation here</summary>
    public const string ValueB = "something else with special characters &@";

    // etc.
}

Использование:

var x = MyConstants.ValueB;
0 голосов
/ 04 августа 2011

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

public const int myConst = 5;

Позже вы измените это на:

public const int myConst = 10;

В исходной сборке, которая была перестроена, это 10. Но это 5 в любых зависимых сборках, которые не были перестроены.

Чтобы избежать этого, используйте readonly вместо const .Например:

public readonly int myConst = 5;

Это отличается от const, который больше похож на C ++ #define, который приводит к тому, что значение помещается непосредственно в код.Readonly вызовет поиск во время выполнения, поэтому, если вы не перекомпилируете зависимые сборки, вы все равно получите правильное, обновленное значение.

...