Как прочитать значение перечисления в ASP.Net? - PullRequest
0 голосов
/ 19 июля 2011

Моя структура перечислений такая

public enum UserRole
{
    Administrator = "Administrator",
    Simple_User = "Simple User",
    Paid_User = "Paid User"
}

Теперь я хочу прочитать это значение перечисления, используя его имя, предположим,

String str = UserRole.Simple_User;

это дает мне "Простой пользователь" в str вместо "Simple_User"

Как мы можем это сделать ???

Ответы [ 5 ]

3 голосов
/ 19 июля 2011

Вы можете сделать дружеское описание следующим образом:

public enum UserRole
    {
        [Description("Total administrator!!1!one")]
        Administrator = 1,

        [Description("This is a simple user")]
        Simple_User = 2,

        [Description("This is a paid user")]
        Paid_User = 3,
    }

И сделать вспомогательную функцию:

 public static string GetDescription(Enum en)
        {
            Type type = en.GetType();

            MemberInfo[] info = type.GetMember(en.ToString());

            if (info != null && info.Length > 0)
            {
                object[] attrs = info[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

                if (attrs != null && attrs.Length > 0)
                {
                    return ((DescriptionAttribute)attrs[0]).Description;
                }
            }

            return en.ToString();
        }

И использовать это как:

string description = GetDescription(UserRole.Administrator);
2 голосов
/ 19 июля 2011

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

public enum ErrorCode
{
    CTCLSM = 1,
    CTSTRPH = 2,
    FBR = 3,
    SNF = 4
}

Кроме того, как показала @StriplingWarrior, вы можете пойти так далеко,получение имени строки enum и замена подчеркиваний и т. д. Но я думаю, что вам нужен способ связать красивую человеческую строку с каждым значением.Как насчет этого?

public enum ErrorCode
{
    [EnumDisplayName("Cataclysm")]
    CTCLSM = 1,
    [EnumDisplayName("Catastrophe")]
    CTSTRPH = 2,
    [EnumDisplayName("Fubar")]
    FBR = 3,
    [EnumDisplayName("Snafu")]
    SNF = 4
}

Хорошо, возможно, в System.ComponentModel что-то есть, что делает это - дайте мне знать .Код моего решения приведен здесь:

[AttributeUsage(AttributeTargets.Field)]
public class EnumDisplayNameAttribute : System.Attribute
{
    public string DisplayName { get; set; }

    public EnumDisplayNameAttribute(string displayName)
    {
        DisplayName = displayName;
    }
}

И необычное расширение Enum, которое делает это возможным:

public static string PrettyFormat(this Enum enumValue)
{
    string text = enumValue.ToString();
    EnumDisplayNameAttribute displayName = (EnumDisplayNameAttribute)enumValue.GetType().GetField(text).GetCustomAttributes(typeof(EnumDisplayNameAttribute), false).SingleOrDefault();

    if (displayName != null)
        text = displayName.DisplayName;
    else
        text = text.PrettySpace().Capitalize(true);

    return text;
}

Таким образом, чтобы получить дружественную человеку ценность, вы могли бы просто сделать ErrorCode.CTSTRPH.PrettyFormat()

1 голос
/ 19 июля 2011

Хм, перечисления не могут иметь строковых значений.Со страницы MSN Enum :

Перечисление - это набор именованных констант, базовый тип которых является любым целым типом, кроме Char.Чтобы получить строковую версию перечисления, используйте метод Enum ToString .

String str = UserRole.Simple_User.ToString("F");
0 голосов
/ 19 июля 2011

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

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

0 голосов
/ 19 июля 2011

Меня немного смущает ваш вопрос, потому что C # не позволяет вам объявлять перечисления, подкрепленные строками.Вы имеете в виду, что вы хотите получить "Простой пользователь", но вместо этого вы получаете "Simple_User"?

Как насчет:

var str = UserRole.Simple_User.ToString().Replace("_", " ");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...