try - 從C#中的枚舉中獲取int值




mvc enum to int (16)

我有一個叫做Questions (複數)的課。 在這個類中有一個名為Question (單數)的枚舉,看起來像這樣。

public enum Question
{
    Role = 2,
    ProjectFunding = 3,
    TotalEmployee = 4,
    NumberOfServers = 5,
    TopBusinessConcern = 6
}

Questions類中,我有一個get(int foo)函數,它返回該foo一個Questions對象。 有沒有一種簡單的方法從枚舉中獲得整數值,所以我可以做一些像Questions.Get(Question.Role)


也許我錯過了它,但有人嘗試過一種簡單的通用擴展方法。 這對我很好。 您可以通過這種方式避免API中的類型轉換,但最終會導致更改類型的操作。 這對編程Roselyn來說是一個很好的例子,讓編譯器為你製作一個GetValue方法。

    public static void Main()
    {
        int test = MyCSharpWrapperMethod(TestEnum.Test1);

        Debug.Assert(test == 1);
    }

    public static int MyCSharpWrapperMethod(TestEnum customFlag)
    {
        return MyCPlusPlusMethod(customFlag.GetValue<int>());
    }

    public static int MyCPlusPlusMethod(int customFlag)
    {
        //Pretend you made a PInvoke or COM+ call to C++ method that require an integer
        return customFlag;
    }

    public enum TestEnum
    {
        Test1 = 1,
        Test2 = 2,
        Test3 = 3
    }
}

public static class EnumExtensions
{
    public static T GetValue<T>(this Enum enumeration)
    {
        T result = default(T);

        try
        {
            result = (T)Convert.ChangeType(enumeration, typeof(T));
        }
        catch (Exception ex)
        {
            Debug.Assert(false);
            Debug.WriteLine(ex);
        }

        return result;
    }
}    

以下是擴展方法

public static string ToEnumString<TEnum>(this int enumValue)
        {
            var enumString = enumValue.ToString();
            if (Enum.IsDefined(typeof(TEnum), enumValue))
            {
                enumString = ((TEnum) Enum.ToObject(typeof (TEnum), enumValue)).ToString();
            }
            return enumString;
        }

只需拋出枚舉,例如

int something = (int) Question.Role;

以上將適用於你在野外看到的絕大多數枚舉,因為枚舉的默認基礎類型是int

但是,正如cecilphillip指出的,枚舉可以有不同的基礎類型。 如果枚舉被聲明為uintlongulong ,則應將其轉換為enum的類型; 例如

enum StarsInMilkyWay:long {Sun = 1, V645Centauri = 2 .. Wolf424B = 2147483649};

你應該使用

long something = (long)StarsInMilkyWay.Wolf424B;

嘗試這個 :

int value = YourEnum.ToString("D");

在相關說明中,如果您想從System.Enum獲取int值,則在此給出e

Enum e = Question.Role;

您可以使用:

int i = Convert.ToInt32(e);
int i = (int)(object)e;
int i = (int)Enum.Parse(e.GetType(), e.ToString());
int i = (int)Enum.ToObject(e.GetType(), e);

最後兩個很難看。 我更喜歡第一個。


如何擴展方法,而不是:

public static class ExtensionMethods
{
    public static int IntValue(this Enum argEnum)
    {
        return Convert.ToInt32(argEnum);
    }
}

用法稍微漂亮些:

var intValue = Question.Role.IntValue();

將其聲明為具有公共常量的靜態類:

public static class Question
{
    public const int Role = 2;
    public const int ProjectFunding = 3;
    public const int TotalEmployee = 4;
    public const int NumberOfServers = 5;
    public const int TopBusinessConcern = 6;
}

然後你可以引用它作為Question.Role ,並且它總是評估一個int或者你定義它的任何東西。


您可以通過將擴展方法實現為您定義的枚舉類型來完成此操作:

public static class MyExtensions
{
    public static int getNumberValue(this Question questionThis)
    {
        return (int)questionThis;
    }
}

這簡化了獲取當前枚舉值的int值:

Question question = Question.Role;
int value = question.getNumberValue();

要么

int value = Question.Role.getNumberValue();

我的意見與int或更小的枚舉破解:

GetHashCode();

對於枚舉

public enum Test
{
    Min = Int32.MinValue,
    One = 1,
    Max = Int32.MaxValue,
}

這個

var values = Enum.GetValues(typeof(Test));

foreach (var val in values) 
{
    Console.WriteLine(val.GetHashCode());
    Console.WriteLine(((int)val));
    Console.WriteLine(val);
}

輸出

one
1
1  
max
2147483647
2147483647    
min
-2147483648
-2147483648    

免責聲明:對於基於long的枚舉不起作用


我能想到的最簡單的解決方案是像這樣重載Get(int)方法:

[modifiers] Questions Get(Question q)
{
    return Get((int)q);
}

其中[modifiers]通常可以與Get(int)方法相同。 如果您無法編輯Questions類或出於某種原因不想要,可以通過編寫擴展來重載該方法:

public static class Extensions
{
    public static Questions Get(this Questions qs, Question q)
    {
        return qs.Get((int)q);
    }
}

為了確保枚舉值存在並解析它,還可以執行以下操作。

// Fake Day of Week
string strDOWFake = "SuperDay";
// Real Day of Week
string strDOWReal = "Friday";
// Will hold which ever is the real DOW.
DayOfWeek enmDOW;

// See if fake DOW is defined in the DayOfWeek enumeration.
if (Enum.IsDefined(typeof(DayOfWeek), strDOWFake))
{
// This will never be reached since "SuperDay" 
// doesn't exist in the DayOfWeek enumeration.
    enmDOW = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), strDOWFake);
}
// See if real DOW is defined in the DayOfWeek enumeration.
else if (Enum.IsDefined(typeof(DayOfWeek), strDOWReal))
{
    // This will parse the string into it's corresponding DOW enum object.
    enmDOW = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), strDOWReal);
}

// Can now use the DOW enum object.
Console.Write("Today is " + enmDOW.ToString() + ".");

我希望這有幫助。


由於枚舉可以是任何整型( byteintshort等),所以獲得枚舉底層整型值的更健壯的方法是將GetTypeCode方法與Convert類結合使用:

enum Sides {
    Left, Right, Top, Bottom
}
Sides side = Sides.Bottom;

object val = Convert.ChangeType(side, side.GetTypeCode());
Console.WriteLine(val);

無論基礎整體類型如何,這都應該起作用。


試試這個而不是將enum轉換為int:

public static class ReturnType
{
    public static readonly int Success = 1;
    public static readonly int Duplicate = 2;
    public static readonly int Error = -1;        
}

這比你想像的容易 - 枚舉已經是一個整數。 只需要提醒一下:

int y = (int)Question.Role;
Console.WriteLine(y); // prints 2

Question question = Question.Role;
int value = (int) question;

將導致value == 2


int number = Question.Role.GetHashCode();

number應該是2的值。





int