Получить значение Enum на основе индекса - c #

Убедитесь, что вы не используете инкрементные целые числа для идентификаторов сеанса. Гораздо лучше использовать GUID или другую длинную случайную последовательность символов.

24
задан denny 17 December 2009 в 19:31
поделиться

4 ответа

string str = "";
int value = 12;
if (Enum.IsDefined(typeof (DocumentTypes),value))
     str =  ((DocumentTypes) value).ToString();
else
     str = "Invalid Value";

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

Вы также можете заменить строку на DocumentTypes, т.е.

DocumentTypes dt = DocumentTypes.Invalid; // Create an invalid enum
if (Enum.IsDefined(typeof (DocumentTypes),value))
   dt = (DocumentTypes) value;

И для бонусной точки, вот как добавить настраиваемую строку в перечисление (скопировано из этого ответа SO )

Enum DocumentType
{ 
    [Description("My Document Type 1")]
    Type1 = 1,
    etc...
}

Затем добавьте где-нибудь метод расширения

public static string GetDescription<T>(this object enumerationValue) where T : struct
{
    Type type = enumerationValue.GetType();
    if (!type.IsEnum)
        throw new ArgumentException("EnumerationValue must be of Enum type", "enumerationValue");

    //Tries to find a DescriptionAttribute for a potential friendly name
    //for the enum
    MemberInfo[] memberInfo = type.GetMember(enumerationValue.ToString());
    if (memberInfo != null && memberInfo.Length > 0)
    {
        object[] attrs = memberInfo[0].GetCustomAttributes(typeof (DescriptionAttribute), false);

        if (attrs != null && attrs.Length > 0)
        {
            //Pull out the description value
            return ( (DescriptionAttribute) attrs[0] ).Description;
        }
    }
    //If we have no description attribute, just return the ToString of the enum
    return enumerationValue.ToString();
}

Затем вы можете использовать:

DocumentType dt = DocumentType.Type1;
string str = dt.GetDescription<DocumentType>();

Которая будет извлекать атрибут описания значение.


Редактировать - обновленный код

Это новая версия метода расширения, которому не нужно заранее знать тип Enum.

public static string GetDescription(this Enum value)
{
    var type = value.GetType();

    var memInfo = type.GetMember(value.ToString());

    if (memInfo.Length > 0)
    {
        var attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
        if (attrs.Length > 0)
            return ((DescriptionAttribute)attrs[0]).Description;
    }

    return value.ToString();
}
24
ответ дан 28 November 2019 в 04:37
поделиться

Вы можете напрямую преобразовать его:

int value = 12;
DocumentTypes dt = (DocumentTypes)value;
37
ответ дан 28 November 2019 в 04:37
поделиться

Попробуйте следующее:

    public enum EnumTest
    {
        EnumOne,
        EnumTwo,
        EnumThree,
        Unknown
    };
    public class EnumTestingClass{
        [STAThread]
        static void Main()
        {
            EnumTest tstEnum = EnumTest.Unknown;
            object objTestEnum;
            objTestEnum = Enum.Parse(tstEnum.GetType(), "EnumThree");
            if (objTestEnum is EnumTest)
            {
                EnumTest newTestEnum = (EnumTest)objTestEnum;
                Console.WriteLine("newTestEnum = {0}", newTestEnum.ToString());
            }
        }
    }

Теперь из примера кода вы увидите, что newTestEnum будет иметь значение из 'EnumTest' эквивалента строки «EnumThree».

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0
ответ дан 28 November 2019 в 04:37
поделиться

Прежде всего приведите к вашему типу перечисления и вызовите ToString ():

string str = ((DocumentTypes)12).ToString();
6
ответ дан 28 November 2019 в 04:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: