简体   繁体   English

基于索引检索枚举的值 - c#

[英]Retrieve value of Enum based on index - c#

This is my enum:这是我的枚举:

public enum DocumentTypes
    {
        [EnumMember]
        TYPE_1 = 1,
        [EnumMember]
        TYPE_2 = 2,
        [EnumMember]
        TYPE_3 = 3,
        [EnumMember]
        TYPE_4 = 4,
        [EnumMember]
        TYPE_5 = 5,
        [EnumMember]
        TYPE_6 = 6,
        [EnumMember]
        TYPE_7 = 7,
        [EnumMember]
        TYPE_8 = 12

    }

If I want to obtain 'TYPE_8', if I only have 12, is there a way to get the enum value?如果我想获得'TYPE_8',如果我只有12个,有没有办法获得枚举值?

I tried this:我试过这个:

((DocumentTypes[])(Enum.GetValues(typeof(DocumentTypes))))[Convert.ToInt32("3")].ToString()

which returns a value of 'TYPE_4'返回“TYPE_4”的值

You can directly cast it:你可以直接投射它:

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

This gives will also handle invalid values trying to be used, without the internal exception being thrown这也将处理尝试使用的无效值,而不会引发内部异常

You can also replace the string with DocumentTypes, ie你也可以用 DocumentTypes 替换字符串,即

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

And for the bonus point, here is how to add a custom string to an enum (copied from this SO answer )对于奖励点,这里是如何将自定义字符串添加到枚举(从这个 SO 答案复制)

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

Then add an extenstion method somewhere然后在某处添加一个扩展方法

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

Then you can use:然后你可以使用:

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

Which will retrive the Description attribute value.这将检索描述属性值。


Edit - updated code编辑 - 更新代码

Here is a new version of the extension method that does't need to know the type of the Enum before hand.这是一个新版本的扩展方法,不需要事先知道 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();
}

首先转换为您的枚举类型并调用 ToString():

string str = ((DocumentTypes)12).ToString();

Try this:试试这个:

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

Now from the sample code you will see that newTestEnum will have the value from the 'EnumTest' equivalent of the string "EnumThree".现在,从示例代码中,您将看到newTestEnum将具有与字符串“EnumThree”等效的“EnumTest”中的值。

Hope this helps, Best regards, Tom.希望这会有所帮助,最好的问候,汤姆。

        public enum Projects
    {
        Hotels = 1,
        Homes = 2,
        Hotel_Home = 3
    }


int projectId = rRoom.GetBy(x => x.RoomId == room.RoomId).FirstOrDefault().ProjectId.TryToInt32();
Projects Project = (Projects)projectId;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM