tags:

views:

337

answers:

4

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?

I tried this:

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

which returns a value of 'TYPE_4'

+8  A: 

You can directly cast it:

int value = 12;
DocumentTypes dt = (DocumentTypes)value;
Darin Dimitrov
+1 beat me by seconds :)
Cory Charlton
The question was how to get the string representation.
GraemeF
Will leave this as an exercise :-)
Darin Dimitrov
A: 

First of all cast to your enum type and call ToString():

string str = ((DocumentTypes)12).ToString();
GraemeF
+3  A: 
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 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)

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.

PostMan
A: 

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".

Hope this helps, Best regards, Tom.

tommieb75