Jak uzyskać wartość wyliczenia, jeśli mam ciąg wyliczenia lub wartość wyliczenia int. np .: Jeśli mam wyliczenie w następujący sposób:
public enum TestEnum
{
Value1 = 1,
Value2 = 2,
Value3 = 3
}
aw jakiejś zmiennej łańcuchowej mam następującą wartość „wartość1”:
string str = "Value1"
lub w jakiejś zmiennej int mam wartość 2 jak
int a = 2;
jak mogę uzyskać wystąpienie enum? Chcę metody ogólnej, w której mogę podać wyliczenie i mój ciąg wejściowy lub wartość int, aby uzyskać wystąpienie wyliczenia.
Odpowiedzi:
Nie, nie chcesz metody ogólnej. To jest dużo łatwiejsze:
MyEnum myEnum = (MyEnum)myInt; MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), myString);
Myślę, że to też będzie szybsze.
źródło
Można to zrobić na wiele sposobów, ale wystarczy prosty przykład. Wystarczy go rozszerzyć o niezbędne kodowanie obronne, aby sprawdzić bezpieczeństwo typu i nieprawidłowe analizowanie itp.
/// <summary> /// Extension method to return an enum value of type T for the given string. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="value"></param> /// <returns></returns> public static T ToEnum<T>(this string value) { return (T) Enum.Parse(typeof(T), value, true); } /// <summary> /// Extension method to return an enum value of type T for the given int. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="value"></param> /// <returns></returns> public static T ToEnum<T>(this int value) { var name = Enum.GetName(typeof(T), value); return name.ToEnum<T>(); }
źródło
Może być znacznie prostsze, jeśli użyjesz metod
TryParse
lubParse
iToObject
.public static class EnumHelper { public static T GetEnumValue<T>(string str) where T : struct, IConvertible { Type enumType = typeof(T); if (!enumType.IsEnum) { throw new Exception("T must be an Enumeration type."); } T val; return Enum.TryParse<T>(str, true, out val) ? val : default(T); } public static T GetEnumValue<T>(int intValue) where T : struct, IConvertible { Type enumType = typeof(T); if (!enumType.IsEnum) { throw new Exception("T must be an Enumeration type."); } return (T)Enum.ToObject(enumType, intValue); } }
Jak zauważył @chrfin w komentarzach, możesz bardzo łatwo uczynić z tego metodę rozszerzającą, dodając
this
przed typem parametru, który może być przydatny.źródło
this
do parametru i ustawEnumHelper
statyczne i możesz ich również używać jako rozszerzeń (zobacz moją odpowiedź, ale masz lepszy / kompletny kod do reszty) ...Poniżej znajduje się metoda w języku C # służąca do pobierania wartości wyliczenia według ciągu
/// /// Method to get enumeration value from string value. /// /// /// public T GetEnumValue<T>(string str) where T : struct, IConvertible { if (!typeof(T).IsEnum) { throw new Exception("T must be an Enumeration type."); } T val = ((T[])Enum.GetValues(typeof(T)))[0]; if (!string.IsNullOrEmpty(str)) { foreach (T enumValue in (T[])Enum.GetValues(typeof(T))) { if (enumValue.ToString().ToUpper().Equals(str.ToUpper())) { val = enumValue; break; } } } return val; }
Poniżej znajduje się metoda w C #, aby uzyskać wartość wyliczenia przez int.
/// /// Method to get enumeration value from int value. /// /// /// public T GetEnumValue<T>(int intValue) where T : struct, IConvertible { if (!typeof(T).IsEnum) { throw new Exception("T must be an Enumeration type."); } T val = ((T[])Enum.GetValues(typeof(T)))[0]; foreach (T enumValue in (T[])Enum.GetValues(typeof(T))) { if (Convert.ToInt32(enumValue).Equals(intValue)) { val = enumValue; break; } } return val; }
Jeśli mam wyliczenie w następujący sposób:
public enum TestEnum { Value1 = 1, Value2 = 2, Value3 = 3 }
wtedy mogę skorzystać z powyższych metod, jak
TestEnum reqValue = GetEnumValue<TestEnum>("Value1"); // Output: Value1 TestEnum reqValue2 = GetEnumValue<TestEnum>(2); // OutPut: Value2
Mam nadzieję, że to pomoże.
źródło
Myślę, że zapomniałeś o ogólnej definicji typu:
public T GetEnumValue<T>(int intValue) where T : struct, IConvertible // <T> added
i możesz go ulepszyć, aby był jak najbardziej wygodny, na przykład:
public static T ToEnum<T>(this string enumValue) : where T : struct, IConvertible { return (T)Enum.Parse(typeof(T), enumValue); }
wtedy możesz:
TestEnum reqValue = "Value1".ToEnum<TestEnum>();
źródło
Spróbuj czegoś takiego
public static TestEnum GetMyEnum(this string title) { EnumBookType st; Enum.TryParse(title, out st); return st; }
Więc możesz to zrobić
TestEnum en = "Value1".GetMyEnum();
źródło
Z bazy danych SQL pobierz wyliczenie takie jak:
SqlDataReader dr = selectCmd.ExecuteReader(); while (dr.Read()) { EnumType et = (EnumType)Enum.Parse(typeof(EnumType), dr.GetString(0)); .... }
źródło
Po prostu spróbuj tego
To inny sposób
public enum CaseOriginCode { Web = 0, Email = 1, Telefoon = 2 } public void setCaseOriginCode(string CaseOriginCode) { int caseOriginCode = (int)(CaseOriginCode)Enum.Parse(typeof(CaseOriginCode), CaseOriginCode); }
źródło
Oto przykład pobierania ciągu / wartości
public enum Suit { Spades = 0x10, Hearts = 0x11, Clubs = 0x12, Diamonds = 0x13 } private void print_suit() { foreach (var _suit in Enum.GetValues(typeof(Suit))) { int suitValue = (byte)(Suit)Enum.Parse(typeof(Suit), _suit.ToString()); MessageBox.Show(_suit.ToString() + " value is 0x" + suitValue.ToString("X2")); } }
Result of Message Boxes Spade value is 0x10 Hearts value is 0x11 Clubs value is 0x12 Diamonds value is 0x13
źródło
Możesz użyć następującej metody, aby to zrobić:
public static Output GetEnumItem<Output, Input>(Input input) { //Output type checking... if (typeof(Output).BaseType != typeof(Enum)) throw new Exception("Exception message..."); //Input type checking: string type if (typeof(Input) == typeof(string)) return (Output)Enum.Parse(typeof(Output), (dynamic)input); //Input type checking: Integer type if (typeof(Input) == typeof(Int16) || typeof(Input) == typeof(Int32) || typeof(Input) == typeof(Int64)) return (Output)(dynamic)input; throw new Exception("Exception message..."); }
Uwaga: ta metoda jest tylko próbką i możesz ją ulepszyć.
źródło