Įterpti įrašą į C #

Kaip gali būti perduodami „ enum “ C #?

2749
27 авг. rinkinys lomaxx 27 rug . 2008-08-27 06:58 '08 6:58 am. 2008-08-27 06:58
@ 23 atsakymai

Iš eilutės:

 YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString); // the foo.ToString().Contains(",") check is necessary for enumerations marked with an [Flags] attribute if (!Enum.IsDefined(typeof(YourEnum), foo)  !foo.ToString().Contains(",")) throw new InvalidOperationException($"{yourString} is not an underlying value of the YourEnum enumeration.") 

Nuo int:

 YourEnum foo = (YourEnum)yourInt; 

Atnaujinti:

Iš numerio, kurį taip pat galite

 YourEnum foo = (YourEnum)Enum.ToObject(typeof(YourEnum) , yourInt); 
3310
27 авг. atsakymą pateikė „ FlySwat“ 27 rug . 2008-08-27 06:59 '08, 6:59 2008-08-27 06:59

Tiesiog atsisakykite:

 MyEnum e = (MyEnum)3; 
border=0

Galite patikrinti, ar jis yra diapazone, naudojant „ Enum.IsDefined“ :

 if (Enum.IsDefined(typeof(MyEnum), 3)) { ... } 
766
27 авг. Atsakyti Matt Hamilton 27 rug. 2008-08-27 07:01 '08, 07:01, 2008-08-27 07:01

Arba galite naudoti išplėtimo metodą vietoj vienos eilutės:

 public static T ToEnum<T>(this string enumString) { return (T) Enum.Parse(typeof (T), enumString); } 

Taikymas:

 Color colorEnum = "Red".ToEnum<Color>(); 

Or

 string color = "Red"; var colorEnum = color.ToEnum<Color>(); 
211
11 нояб. Abdul Munim lapkričio 11 d. Atsakymas 2011-11-11 16:27 '11, 16:27, 2011-11-11 16:27

Manau, kad gausiu visišką atsakymą, žmonės turi žinoti, kaip viskas veikia .NET.

Kaip medžiaga veikia

„.NET“ sąrašas yra struktūra, kurioje žemėlapių rinkinys (laukai) susiejamas su pagrindiniu tipu (numatytasis yra int ). Tačiau galite pasirinkti integracijos tipą, kuris atitinka jūsų įrašą:

 public enum Foo : short 

Tokiu atveju skaičiavimas konvertuojamas į short duomenų tipą, o tai reiškia, kad jis bus saugomas atmintyje kaip trumpas ir bus naudojamas kaip trumpas.

Jei žiūrite į jį iš IL, (enum, int) enum atrodo taip:

 .class public auto ansi serializable sealed BarFlag extends System.Enum { .custom instance void System.FlagsAttribute::.ctor() .custom instance void ComVisibleAttribute::.ctor(bool) = { bool(true) } .field public static literal valuetype BarFlag AllFlags = int32(0x3fff) .field public static literal valuetype BarFlag Foo1 = int32(1) .field public static literal valuetype BarFlag Foo2 = int32(0x2000) // and so on for all flags or enum values .field public specialname rtspecialname int32 value__ } 

value__ atkreipti dėmesį į tai, kad value__ saugoma atskirai nuo skaičiavimo reikšmių. Foo sąrašo atveju tipo value__ yra int16. Tai iš esmės reiškia, kad galite įrašyti viską, ką norite , jei tai atitinka .

Šiuo metu norėčiau pabrėžti, kad „ System.Enum yra vertės tipas, kuris iš esmės reiškia, kad „ BarFlag “ užims 4 baitus atmintyje, o „ Foo “ užims 2 pavyzdžius. bazinio tipo dydis (tai iš tikrųjų yra sudėtingesnis nei tai, bet ne ...).

Atsakymas

Taigi, jei turite sveiką skaičių, kurį norite susieti su skaičiavimu, vykdymo laikas turėtų būti tik 2 dalykai: nukopijuokite 4 baitus ir pavadinkite jį kitu (enum pavadinimas). Kopijavimas yra netiesioginis, nes duomenys saugomi kaip vertės tipas - tai iš esmės reiškia, kad jei naudojate nevaldomą kodą, galite tiesiog keistis Enums ir sveikaisiais skaičiais be kopijavimo.

Manau, kad geriausia praktika yra ta, kad pagrindiniai tipai yra vienodi arba netiesiogiai konvertuojami ir kad būtų galima nustatyti skaičiavimo reikšmes (jos nėra patikrintos pagal nutylėjimą!).

Norėdami sužinoti, kaip jis veikia, išbandykite šį kodą:

 public enum MyEnum : int { Foo = 1, Bar = 2, Mek = 5 } static void Main(string[] args) { var e1 = (MyEnum)5; var e2 = (MyEnum)6; Console.WriteLine("{0} {1}", e1, e2); Console.ReadLine(); } 

Atkreipkite dėmesį, kad „ e2 atsisakymas taip pat veikia! Pirmiau pateikto kompiliatoriaus požiūriu tai yra prasminga: laukas value__ tiesiog užpildytas arba 5, arba 6, o kai Console.WriteLine skambina ToString() , pavadinimas e1 išspręstas, bet vardas e2 nėra.

Jei taip nenorite, naudokite „ Enum.IsDefined(typeof(MyEnum), 6) kad patikrintumėte, ar sukuriama vertė atitinka konkretų skaičių.

Taip pat atkreipkite dėmesį, kad esu aiškus dėl pagrindinio sąrašo tipo, nors kompiliatorius tai patvirtina. Tai darysiu taip, kad ateityje nekilsiu netikėtumų. Norėdami matyti šiuos nustebimus, galite naudoti šį kodą (iš tiesų, aš pamačiau, kaip tai įvyko duomenų bazės kode):

 public enum MyEnum : short { Mek = 5 } static void Main(string[] args) { var e1 = (MyEnum)32769; // will not compile, out of bounds for a short object o = 5; var e2 = (MyEnum)o; // will throw at runtime, because o is of type int Console.WriteLine("{0} {1}", e1, e2); Console.ReadLine(); } 
132
03 апр. atsakymas pateikiamas atlaste 03 Bal. 2014-04-03 10:39 '14 at 10:39 2014-04-03 10:39

Paimkite šį pavyzdį:

 int one = 1; MyEnum e = (MyEnum)one; 
98
27 авг. atsakymas pateikiamas abigblackman 27 rug . 2008-08-27 07:00 '08, 7:00, 2008-08-27 07:00

Naudoju šį kodą, kad galėtumėte konvertuoti į mano enumų sąrašą:

 if (typeof(YourEnum).IsEnumDefined(valueToCast)) return (YourEnum)valueToCast; else { //handle it here, if its not defined } 

Manau, kad tai geriausias sprendimas.

58
21 окт. atsakymas duotas MSkuta 21 okt. 2011-10-21 13:05 '11, 13:05, 2011-10-21 13:05

Toliau pateikiamas „Enums“ geras klasės įrankis

 public static class EnumHelper { public static int[] ToIntArray<T>(T[] value) { int[] result = new int[value.Length]; for (int i = 0; i < value.Length; i++) result[i] = Convert.ToInt32(value[i]); return result; } public static T[] FromIntArray<T>(int[] value) { T[] result = new T[value.Length]; for (int i = 0; i < value.Length; i++) result[i] = (T)Enum.ToObject(typeof(T),value[i]); return result; } internal static T Parse<T>(string value, T defaultValue) { if (Enum.IsDefined(typeof(T), value)) return (T) Enum.Parse(typeof (T), value); int num; if(int.TryParse(value,out num)) { if (Enum.IsDefined(typeof(T), num)) return (T)Enum.ToObject(typeof(T), num); } return defaultValue; } } 
47
07 сент. Atsakymas pateikiamas Tawani 07 Sep. 2010-09-07 07:42 '10, 7:42, 2010-09-07 07:42

Skaitmeninėms reikšmėms tai yra saugesnis, nes jis grąžins objektą nepriklausomai nuo to, kad:

 public static class EnumEx { static public bool TryConvert<T>(int value, out T result) { result = default(T); bool success = Enum.IsDefined(typeof(T), value); if (success) { result = (T)Enum.ToObject(typeof(T), value); } return success; } } 
40
21 февр. atsakymą pateikė Sébastien Duval 21 vasaris. 2013-02-21 18:22 '13, 18:22, 2013-02-21 18:22

Jei esate pasiruošę kurti 4.0 .NET , yra nauja funkcija Enum.TryParse (), kuri yra labai naudinga ir gerai veikia su [Flags] atributu. Žr. „ Enum.TryParse“ metodas (eilutė, „TEnum%“)

39
01 нояб. atsakymą pateikė Ryan Russon . 2011-11-01 17:58 '11, 17:58, 2011-11-01 17:58

Jei turite sveiką skaičių, kuris veikia kaip bitmas ir gali pateikti vieną ar daugiau reikšmių [Flags] sąraše, galite naudoti šį kodą, kad analizuotumėte atskirų sąrašų reikšmes:

 for (var flagIterator = 0; flagIterator < 32; flagIterator++) { // Determine the bit value (1,2,4,...,Int32.MinValue) int bitValue = 1 << flagIterator; // Check to see if the current flag exists in the bit mask if ((intValue  bitValue) != 0) { // If the current flag exists in the enumeration, then we can add that value to the list // if the enumeration has that flag defined if (Enum.IsDefined(typeof(MyEnum), bitValue)) Console.WriteLine((MyEnum)bitValue); } } 

Atkreipkite dėmesį, kad tai reiškia, kad pagrindinis enum tipas yra 32 bitų pasirašytas sveikasis skaičius. Jei tai būtų kitoks skaitinis tipas, jums reikės keisti 32 koduotą kodą, kad atspindėtų šio tipo bitus (arba gauti programiniu būdu naudodami Enum.GetUnderlyingType() ).

26
13 апр. atsakymą pateikė Evan M 13 balandžio. 2011-04-13 23:13 '11 11:13 PM 2011-04-13 23:13

Kartais turite tokį objektą kaip „ MyEnum . Kaip

 var MyEnumType = typeof(MyEnumType); 

Tada:

 Enum.ToObject(typeof(MyEnum), 3) 
24
02 июля '10 в 17:41 2010-07-02 17:41 atsakymas pateikiamas LD liepos 10 d. 10 val. 17:41 2010-07-02 17:41

Tai saugus konversijos metodas, kuriame išvardytos vėliavos:

 public static bool TryConvertToEnum<T>(this int instance, out T result) where T: Enum { var enumType = typeof (T); var success = Enum.IsDefined(enumType, instance); if (success) { result = (T)Enum.ToObject(enumType, instance); } else { result = default(T); } return success; } 
20
30 марта '15 в 13:08 2015-03-30 13:08 Danielio Fisherio Lennybacono atsakymas kovo 30 d. 15 d. 13:08 2015-03-30 13:08

2019

19
05 февр. atsakymą pateikė Shivprasad Koirala 05 vasaris. 2014-02-05 15:15 '14, 15:15 2014-02-05 15:15

Šiek tiek atsitraukite nuo pradinio klausimo, bet atsakymas į ngn-wiki.ru klausimą buvo gautas . Sukurkite statinę klasę, naudodami public const int savybes, leidžiančias lengvai surinkti susietų int konstantų krūva ir tada nenaudoti su int naudodami juos.

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

Akivaizdu, kad kai kurios funkcijos, pvz., „ENUM“, bus prarastos, tačiau duomenų bazės identifikatorių konstantų saugojimui tai atrodo gana tvarkingas sprendimas.

16
17 июля '14 в 17:39 2014-07-17 17:39 Atsakymas pateikiamas Ted 17 liepos 14 d. 17:39 17:39

Jis išskirsto sveikuosius skaičius arba eilutes į taikinį su daliniu atitikimu dot.NET 4.0, naudodamasis generiniais vaistais, pvz., Aukščiau pateikta Tawani naudingumo klasė. Naudoju jį paversti komandų eilutės pagrindinius kintamuosius, kurie gali būti neišsamūs. Kadangi skaičiavimas negali būti nulinis, turite logiškai pateikti numatytąją vertę. Jis gali būti vadinamas:

 var result = EnumParser<MyEnum>.Parse(valueToParse, MyEnum.FirstValue); 

Čia yra kodas:

 using System; public class EnumParser<T> where T : struct { public static T Parse(int toParse, T defaultVal) { return Parse(toParse + "", defaultVal); } public static T Parse(string toParse, T defaultVal) { T enumVal = defaultVal; if (defaultVal is Enum  !String.IsNullOrEmpty(toParse)) { int index; if (int.TryParse(toParse, out index)) { Enum.TryParse(index + "", out enumVal); } else { if (!Enum.TryParse<T>(toParse + "", true, out enumVal)) { MatchPartialName(toParse, ref enumVal); } } } return enumVal; } public static void MatchPartialName(string toParse, ref T enumVal) { foreach (string member in enumVal.GetType().GetEnumNames()) { if (member.ToLower().Contains(toParse.ToLower())) { if (Enum.TryParse<T>(member + "", out enumVal)) { break; } } } } } 

FYI: sveikieji skaičiai, apie kuriuos niekas nepaminėjo, taip pat bus aiškiai konvertuoti į „Enum.TryParse“ ()

12
30 июля '14 в 23:02 2014-07-30 23:02 atsakymą pateikė CZahrobsky liepos 30 d. 14, 23:02 2014-07-30 23:02

Iš linijos: („Enum.Parse“ yra pasenusi, naudokite „Enum.TryParse“)

 enum Importance {} Importance importance; if (Enum.TryParse(value, out importance)) { } 
12
21 нояб. Atsakymą pateikė Will Yu lapkričio 21 d. 2014-11-21 03:32 '14, 3:32 2014-11-21 03:32

Mano atveju, turėjau grąžinti sąrašą iš WCF tarnybos. Man taip pat reikėjo draugiško vardo, ne tik enum.ToString ().

Čia yra mano WCF klasė.

 [DataContract] public class EnumMember { [DataMember] public string Description { get; set; } [DataMember] public int Value { get; set; } public static List<EnumMember> ConvertToList<T>() { Type type = typeof(T); if (!type.IsEnum) { throw new ArgumentException("T must be of type enumeration."); } var members = new List<EnumMember>(); foreach (string item in System.Enum.GetNames(type)) { var enumType = System.Enum.Parse(type, item); members.Add( new EnumMember() { Description = enumType.GetDescriptionValue(), Value = ((IConvertible)enumType).ToInt32(null) }); } return members; } } 

Tai naudoja išplėtimo metodą, kuris gauna aprašą iš „Enum“.

  public static string GetDescriptionValue<T>(this T source) { FieldInfo fileInfo = source.GetType().GetField(source.ToString()); DescriptionAttribute[] attributes = (DescriptionAttribute[])fileInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); if (attributes != null  attributes.Length > 0) { return attributes[0].Description; } else { return source.ToString(); } } 

Įgyvendinimas:

 return EnumMember.ConvertToList<YourType>(); 
9
02 июля '14 в 17:58 2014-07-02 17:58 atsakymą pateikė „ LawMan“ liepos 2 d. 14 d. 17:58 2014-07-02 17:58

Žemiau yra šiek tiek geresnis išplėtimo metodas.

 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; } 
9
16 дек. Atsakymą pateikė Kamranas Shahidas 16 d. 2016-12-16 09:59 '16 at 9:59 2016-12-16 09:59

Skirtingi būdai perkelti į „ Enum ir iš jo

 enum orientation : byte { north = 1, south = 2, east = 3, west = 4 } class Program { static void Main(string[] args) { orientation myDirection = orientation.north; Console.WriteLine("myDirection = {0}", myDirection); //output myDirection =north Console.WriteLine((byte)myDirection); //output 1 string strDir = Convert.ToString(myDirection); Console.WriteLine(strDir); //output north string myString = "north"; //to convert string to Enum myDirection = (orientation)Enum.Parse(typeof(orientation),myString); } } 
7
08 янв. atsakymą pateikia „ gmail“ vartotojas 08 jan. 2014-01-08 18:18 '14, 18:18, 2014-01-08 18:18

Aš daugiau nežinau, kur gaunu dalį šio enumo pratęsimo, bet jis yra iš stackoverflow. Atsiprašau už tai! Bet aš jį paėmiau ir pakeitiau, kad galėčiau naudoti sąrašus su vėliavomis. Jei naudojate sąrašus su žymės >

  public static class Enum<T> where T : struct { private static readonly IEnumerable<T> All = Enum.GetValues(typeof (T)).Cast<T>(); private static readonly Dictionary<int, T> Values = All.ToDictionary(k => Convert.ToInt32(k)); public static T? CastOrNull(int value) { T foundValue; if (Values.TryGetValue(value, out foundValue)) { return foundValue; } // For enums with Flags-Attribut. try { bool isFlag = typeof(T).GetCustomAttributes(typeof(FlagsAttribute), false).Length > 0; if (isFlag) { int existingIntValue = 0; foreach (T t in Enum.GetValues(typeof(T))) { if ((value  Convert.ToInt32(t)) > 0) { existingIntValue |= Convert.ToInt32(t); } } if (existingIntValue == 0) { return null; } return (T)(Enum.Parse(typeof(T), existingIntValue.ToString(), true)); } } catch (Exception) { return null; } return null; } } 

Pavyzdys:

 [Flags] public enum PetType { None = 0, Dog = 1, Cat = 2, Fish = 4, Bird = 8, Reptile = 16, Other = 32 }; integer values 1=Dog; 13= Dog | Fish | Bird; 96= Other; 128= Null; 
7
07 янв. Franki1986 atsakymas 07 Jan 2016-01-07 14:40 '16 at 14:40 2016-01-07 14:40

Tai gali padėti jums konvertuoti bet kurį įvestį į norimą vartotojo sąrašą . Tarkime, kad turite tokį enum kaip žemiau, numatytasis yra int . Pirmiausia pridėkite numatytąją vertę. Naudoja medalių pagalbininkai, kai nėra atitikties įvesties vertei.

 public enum FriendType { Default, Audio, Video, Image } public static class EnumHelper<T> { public static T ConvertToEnum(dynamic value) { var result = default(T); var tempType = 0; //see Note below if (value != null  int.TryParse(value.ToString(), out tempType)  Enum.IsDefined(typeof(T), tempType)) { result = (T)Enum.ToObject(typeof(T), tempType); } return result; } } 

NB: Čia bandau išanalizuoti vertę int, nes enum yra numatytasis int, jei apibrėžiate panašų į tipo baitą .

 public enum MediaType : byte { Default, Audio, Video, Image } 

Turite keisti pagalbininko metodo analizę

 int.TryParse(value.ToString(), out tempType) 

į

byte.TryParse(value.ToString(), out tempType)

Bandau savo metodą šiems įvestims

 EnumHelper<FriendType>.ConvertToEnum(null); EnumHelper<FriendType>.ConvertToEnum(""); EnumHelper<FriendType>.ConvertToEnum("-1"); EnumHelper<FriendType>.ConvertToEnum("6"); EnumHelper<FriendType>.ConvertToEnum(""); EnumHelper<FriendType>.ConvertToEnum("2"); EnumHelper<FriendType>.ConvertToEnum(-1); EnumHelper<FriendType>.ConvertToEnum(0); EnumHelper<FriendType>.ConvertToEnum(1); EnumHelper<FriendType>.ConvertToEnum(9); 

atsiprašau už mano anglų kalbą

6
17 нояб. atsakymas pateikiamas reza.cse08 lapkričio 17 d. 2016-11-17 15:49 '16 at 15:49 PM 2016-11-17 15:49

Paprastas ir paprastas būdas atkurti C #:

  public class Program { public enum Color : int { Blue = 0, Black = 1, Green = 2, Gray = 3, Yellow =4 } public static void Main(string[] args) { //from string Console.WriteLine((Color) Enum.Parse(typeof(Color), "Green")); //from int Console.WriteLine((Color)2); //From number you can also Console.WriteLine((Color)Enum.ToObject(typeof(Color) ,2)); } } 
3
08 дек. Atsakymą pateikė Mohammad Aziz Nabizada, gruodžio 8 d. 2018-12-08 08:06 '18, 08:06 2018-12-08 08:06

Jūs paprasčiausiai naudosite aiškų „ cast cast“, kad galėtumėte išgirsti arba išgirsti

 class Program { static void Main(string[] args) { Console.WriteLine((int)Number.three); //Output=3 Console.WriteLine((Number)3);// Outout three Console.Read(); } public enum Number { Zero = 0, One = 1, Two = 2, three = 3 } } 
0
01 февр. atsakymą pateikė Shivam Mishra 01 vasaris. 2019-02-01 13:15 „19, 15:15 pm 2019-02-01 13:15

Kiti klausimai apie žymes arba Užduoti klausimą