¿Cómo puedo convertir int a enum?
Frecuentes
Visto 1,529 veces
30 Respuestas
4060
Desde un int:
YourEnum foo = (YourEnum)yourInt;
De una cadena:
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.")
}
Actualizar:
Desde el número también puede
YourEnum foo = (YourEnum)Enum.ToObject(typeof(YourEnum) , yourInt);
Respondido 17 ago 20, 20:08
961
Solo échalo:
MyEnum e = (MyEnum)3;
Puede verificar si está dentro del rango usando Enum.IsDefined:
if (Enum.IsDefined(typeof(MyEnum), 3)) { ... }
Respondido 27 ago 08, 05:08
Tenga en cuenta que no puede usar Enum.IsDefined si usa el atributo Flags y el valor es una combinación de banderas, por ejemplo: Keys.L | Keys.Control - destruir
Con respecto a Enum.IsDefined
, tenga en cuenta que puede ser peligroso: msdn.microsoft.com/en-us/library/ms229025(VS.90).aspx - adrian
... Porque tu definición puede ser engañosa, porque estás diciendo: "... comprueba si está dentro del alcance ..." lo que implica dentro de un rango de números con límites iniciales y finales ... - Papilla
@ mac9416 He intentado dar un ejemplo sucinto en gist.github.com/alowdon/f7354cda97bac70b44e1c04bc0991bcc - básicamente usando IsDefined
para verificar los valores de entrada, se deja vulnerable a que las personas agreguen nuevos valores de enumeración más adelante, lo que IsDefined
check (ya que el nuevo valor existe en el nuevo código), pero es posible que no funcione con el código original que escribió. Por lo tanto, es más seguro especificar explícitamente los valores de enumeración que su código puede manejar. - adrian
257
Alternativamente, use un método de extensión en lugar de una sola línea:
public static T ToEnum<T>(this string enumString)
{
return (T) Enum.Parse(typeof (T), enumString);
}
Uso:
Color colorEnum = "Red".ToEnum<Color>();
OR
string color = "Red";
var colorEnum = color.ToEnum<Color>();
Respondido el 07 de enero de 16 a las 20:01
Para procesar la entrada del usuario, probablemente sea una buena idea llamar a la sobrecarga de Enum.Parse, que le permite especificar que la comparación NO distinga entre mayúsculas y minúsculas (es decir, un usuario que escriba "rojo" (minúsculas) bloqueará el código anterior sin este cambio .) - BrainSlugs83
Práctico, pero la pregunta se refiere específicamente a ints. - Jurado
esto también funciona si la cadena es un número entero, por ejemplo, "2" - VerdadDe42
Esto arrojará una excepción si enumString es nulo (ayer tuvo un problema similar). Considere usar TryParse en lugar de Parse. TryParse también comprobará si T es un tipo de enumeración - Justin
Este tipo de método de extensión en System.String
parece contaminación del espacio de nombres - Sr. Anderson
176
Creo que para obtener una respuesta completa, la gente tiene que saber cómo funcionan las enumeraciones internamente en .NET.
Como funcionan las cosas
Una enumeración en .NET es una estructura que asigna un conjunto de valores (campos) a un tipo básico (el valor predeterminado es int
). Sin embargo, en realidad puede elegir el tipo integral al que se asigna su enumeración:
public enum Foo : short
En este caso, la enumeración se asigna a la short
tipo de datos, lo que significa que se almacenará en la memoria como un corto y se comportará como un corto cuando lo transmita y use.
Si lo mira desde el punto de vista de IL, una enumeración (normal, int) se ve así:
.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__
}
Lo que debería llamar su atención aquí es que el value__
se almacena por separado de los valores de enumeración. En el caso de la enumeración Foo
arriba, el tipo de value__
es int16. Esto básicamente significa que puede almacenar lo que quiera en una enumeración, siempre que los tipos coincidan.
En este punto me gustaría señalar que System.Enum
es un tipo de valor, lo que básicamente significa que BarFlag
ocupará 4 bytes en la memoria y Foo
ocupará 2, por ejemplo, el tamaño del tipo subyacente (en realidad es más complicado que eso, pero bueno ...).
La respuesta
Entonces, si tiene un número entero que desea asignar a una enumeración, el tiempo de ejecución solo tiene que hacer 2 cosas: copiar los 4 bytes y nombrarlo de otra manera (el nombre de la enumeración). La copia es implícita porque los datos se almacenan como tipo de valor; esto básicamente significa que si usa código no administrado, simplemente puede intercambiar enumeraciones y enteros sin copiar datos.
Para que sea seguro, creo que es una buena práctica saber que los tipos subyacentes son los mismos o implícitamente convertibles y para asegurarse de que existan los valores de enumeración (¡no están marcados por defecto!).
Para ver cómo funciona esto, pruebe el siguiente código:
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();
}
Tenga en cuenta que la transmisión a e2
¡también funciona! Desde la perspectiva del compilador anterior, esto tiene sentido: el value__
El campo simplemente se llena con 5 o 6 y cuando Console.WriteLine
llamadas ToString()
, el nombre de e1
se resuelve mientras el nombre de e2
no es.
Si eso no es lo que pretendías, usa Enum.IsDefined(typeof(MyEnum), 6)
para comprobar si el valor que está enviando se corresponde con una enumeración definida.
También tenga en cuenta que soy explícito sobre el tipo subyacente de la enumeración, aunque el compilador realmente comprueba esto. Estoy haciendo esto para asegurarme de no encontrarme con sorpresas en el futuro. Para ver estas sorpresas en acción, puede usar el siguiente código (de hecho, he visto que esto sucede mucho en el código de la base de datos):
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();
}
Respondido 03 Abr '14, 08:04
Me doy cuenta de que esta es una publicación antigua, pero ¿cómo se obtiene este nivel de conocimiento en c #? ¿Es esto por leer la especificación de C #? - Rolan
@Rolan A veces deseo que más personas pregunten eso. :-) Para ser honesto, realmente no lo sé; Intento entender cómo funcionan las cosas y obtener información donde sea que pueda. Leí el estándar C #, pero también descompilo código regularmente con Reflector (incluso miro mucho el código del ensamblador x86) y hago toneladas de pequeños experimentos. Además, conocer otros idiomas ayuda en este caso; He estado haciendo CS durante unos 30 años y, en algún momento, ciertas cosas se vuelven `` lógicas '', p. Ej. una enumeración debe tipos integrales, porque de lo contrario la interoperabilidad se romperá (o su rendimiento se irá por el desagüe). - atlasto
Creo que la clave para hacer ingeniería de software correctamente es saber cómo funcionan las cosas. Para mí, eso significa que si escribes un fragmento de código, sabes cómo se traduce aproximadamente a f.ex. operaciones del procesador y recuperaciones / escrituras de memoria. Si pregunta cómo llegar a ese nivel, le sugiero que cree un montón de casos de prueba pequeños, haciéndolos más difíciles a medida que avanza, intente predecir el resultado cada vez y pruébelos después (incluida la descompilación, etc.). Después de averiguar todos los detalles y todas las características, puede verificar si lo hizo bien en el estándar (aburrido). Al menos, ese sería mi enfoque. - atlasto
Fantástica respuesta, gracias! En su última muestra de código, arroja una excepción en tiempo de ejecución porque o es un objeto. Puede convertir una variable int a un corto siempre que se encuentre dentro del rango corto. - Pensamientos grávidos
@gravidThoughts Gracias. En realidad, es una operación de unboxing, por lo que no realizará conversiones implícitas como las que describe. La conversión a veces es confusa en C # si no conoce los detalles ... De todos modos, porque int
!= short
, arrojará (el desempaquetado falla). Si lo haces object o = (short)5;
, funcionará, porque entonces los tipos coincidirán. No se trata del rango, realmente se trata del tipo. - atlasto
130
Tome el siguiente ejemplo:
int one = 1;
MyEnum e = (MyEnum)one;
Respondido el 25 de diciembre de 16 a las 09:12
70
Estoy usando este fragmento de código para convertir int a mi enumeración:
if (typeof(YourEnum).IsEnumDefined(valueToCast)) return (YourEnum)valueToCast;
else { //handle it here, if its not defined }
Encuentro que es la mejor solución.
Respondido 21 Oct 11, 11:10
Esto es bueno. Me sorprendió que no hubiera una excepción al lanzar un valor no válido a una enumeración respaldada por int. - orión elenzil
En realidad, esto no es tan diferente de la respuesta mejor calificada. Esa respuesta también analiza el uso de Enum.IsDefined después de haber lanzado la cadena al tipo Enum. Entonces, incluso si la cadena se lanzó sin errores, Enum.IsDefined aún la detectará: Don Cheadle
56
A continuación se muestra una buena clase de utilidad para Enums
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;
}
}
Respondido el 07 de Septiembre de 10 a las 05:09
48
Para valores numéricos, esto es más seguro ya que devolverá un objeto sin importar qué:
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;
}
}
Respondido el 07 de enero de 16 a las 20:01
Devuelve predeterminado (T) cuando no está definido. ¿Cómo ayuda eso a identificar los indefinidos? - Ε Ã И І И О
47
Si estás listo para la 4.0 .NET Framework, hay un nuevo Enum.TryParse () función que es muy útil y funciona bien con el atributo [Flags]. Ver Método Enum.TryParse (String, TEnum%)
Respondido 31 ago 12, 21:08
Eso es útil cuando se convierte de una cadena. Pero no al convertir de un int. - CódigosInChaos
39
Si tiene un número entero que actúa como una máscara de bits y podría representar uno o más valores en una enumeración [Flags], puede usar este código para analizar los valores de las banderas individuales en una lista:
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);
}
}
Tenga en cuenta que esto supone que el tipo subyacente de enum
es un entero de 32 bits con signo. Si fuera un tipo numérico diferente, tendría que cambiar el 32 codificado para reflejar los bits en ese tipo (o derivarlo programáticamente usando Enum.GetUnderlyingType()
)
Respondido el 02 de enero de 19 a las 15:01
32
A veces tienes un objeto al MyEnum
tipo. Como
var MyEnumType = typeof(MyEnum);
Entonces:
Enum.ToObject(typeof(MyEnum), 3)
Respondido 20 Oct 20, 06:10
28
Este es un método de conversión seguro consciente de la enumeración de banderas:
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;
}
respondido 12 nov., 18:18
Esto ahora se puede mejorar con C # 7.3 restringiendo a Enum
en lugar de struct
, lo que significa que no tenemos que depender de la verificación del tiempo de ejecución. - Scott
21
Para convertir una cadena a ENUM o int a ENUM constante, necesitamos usar la función Enum.Parse. Aquí hay un video de youtube https://www.youtube.com/watch?v=4nhx4VwdRDk que en realidad demuestran con una cadena y lo mismo se aplica para int.
El código es como se muestra a continuación, donde "rojo" es la cadena y "MyColors" es el color ENUM que tiene las constantes de color.
MyColors EnumColors = (MyColors)Enum.Parse(typeof(MyColors), "Red");
Respondido 05 Feb 14, 12:02
21
Un poco alejándome de la pregunta original, pero encontré una respuesta a la pregunta de Stack Overflow Obtener valor int de enum útil. Crea una clase estática con public const int
propiedades, lo que le permite recopilar fácilmente un montón de int
constantes, y luego no tener que lanzarlas a int
al usarlos.
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;
}
Obviamente, se perderá parte de la funcionalidad del tipo de enumeración, pero para almacenar un montón de constantes de identificación de base de datos, parece una solución bastante ordenada.
contestado el 23 de mayo de 17 a las 11:05
enums reemplazó el uso de constantes enteras como esta, ya que proporcionan más seguridad de tipos - Paul Richards
Paul, este es un método para recopilar constantes int relacionadas (por ejemplo, constantes de ID de base de datos) para que se puedan usar directamente sin tener que convertirlas en int cada vez que se usan. Su tipo is integer, no por ejemplo, DatabaseIdsEnum. - Ted
Hay al menos una situación que he encontrado en la que la seguridad del tipo de enumeración se puede omitir involuntariamente. - Thierry
Pero las enumeraciones también se aseguran de que todos los valores sean únicos, algo de lo que este enfoque también carece: derHugo
17
Esto analiza enteros o cadenas a una enumeración de destino con coincidencia parcial en .NET 4.0 usando genéricos como en Clase de utilidad de Tawani. Lo estoy usando para convertir variables de cambio de línea de comandos que pueden estar incompletas. Dado que una enumeración no puede ser nula, lógicamente debe proporcionar un valor predeterminado. Se puede llamar así:
var result = EnumParser<MyEnum>.Parse(valueToParse, MyEnum.FirstValue);
Aquí está el código:
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: La pregunta era sobre números enteros, que nadie mencionó también convertirá explícitamente en Enum.TryParse ()
Respondido 13 Jul 20, 01:07
15
De una cadena: (Enum.Parse está desactualizado, use Enum.TryParse)
enum Importance
{}
Importance importance;
if (Enum.TryParse(value, out importance))
{
}
respondido 21 nov., 14:00
La pregunta se refiere específicamente a los números enteros. - Jurado
Will Yu, por favor, edite su respuesta para que todos sepan Enum. TryParse funcionará en una cadena del valor o el nombre de la enumeración (no pude resistir) - Jeremy Weir
Jeremy, Weir está trabajando en eso (tampoco pudo resistirse). - huysentruitw
15
El siguiente es un método de extensión ligeramente mejor:
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;
}
Respondido 13 Jul 20, 01:07
esto es en realidad mucho mejor porque si el valor int no es una entrada definida en la enumeración, puede usar una instrucción else para establecer enumString en un valor predeterminado. Gracias - NDUF
12
Debería incorporar algún tipo de relajación que coincida con el tipo para ser más robusto.
public static T ToEnum<T>(dynamic value)
{
if (value == null)
{
// default value of an enum is the object that corresponds to
// the default value of its underlying type
// https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/default-values-table
value = Activator.CreateInstance(Enum.GetUnderlyingType(typeof(T)));
}
else if (value is string name)
{
return (T)Enum.Parse(typeof(T), name);
}
return (T)Enum.ToObject(typeof(T),
Convert.ChangeType(value, Enum.GetUnderlyingType(typeof(T))));
}
Caso de prueba
[Flags]
public enum A : uint
{
None = 0,
X = 1 < 0,
Y = 1 < 1
}
static void Main(string[] args)
{
var value = EnumHelper.ToEnum<A>(7m);
var x = value.HasFlag(A.X); // true
var y = value.HasFlag(A.Y); // true
var value2 = EnumHelper.ToEnum<A>("X");
var value3 = EnumHelper.ToEnum<A>(null);
Console.ReadKey();
}
Respondido el 07 de Septiembre de 19 a las 19:09
Esta es una buena respuesta. ¡Es una pena que esté tan abajo en la página en este momento! - mikebeaton
11
En mi caso, necesitaba devolver la enumeración de un servicio WCF. También necesitaba un nombre descriptivo, no solo el enum.ToString ().
Aquí está mi clase WCF.
[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;
}
}
Aquí está el método de extensión que obtiene la descripción de la enumeración.
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();
}
}
Implementación:
return EnumMember.ConvertToList<YourType>();
Respondido 02 Jul 14, 15:07
11
Aquí hay un método de extensión que arroja Int32
a Enum
.
Respeta los indicadores bit a bit incluso cuando el valor es superior al máximo posible. Por ejemplo, si tiene una enumeración con posibilidades 1, 2 y 4, pero el int es 9, entiende que como 1 en ausencia de un 8. Esto le permite realizar actualizaciones de datos antes de las actualizaciones de código.
public static TEnum ToEnum<TEnum>(this int val) where TEnum : struct, IComparable, IFormattable, IConvertible
{
if (!typeof(TEnum).IsEnum)
{
return default(TEnum);
}
if (Enum.IsDefined(typeof(TEnum), val))
{//if a straightforward single value, return that
return (TEnum)Enum.ToObject(typeof(TEnum), val);
}
var candidates = Enum
.GetValues(typeof(TEnum))
.Cast<int>()
.ToList();
var isBitwise = candidates
.Select((n, i) => {
if (i < 2) return n == 0 || n == 1;
return n / 2 == candidates[i - 1];
})
.All(y => y);
var maxPossible = candidates.Sum();
if (
Enum.TryParse(val.ToString(), out TEnum asEnum)
&& (val <= maxPossible || !isBitwise)
){//if it can be parsed as a bitwise enum with multiple flags,
//or is not bitwise, return the result of TryParse
return asEnum;
}
//If the value is higher than all possible combinations,
//remove the high imaginary values not accounted for in the enum
var excess = Enumerable
.Range(0, 32)
.Select(n => (int)Math.Pow(2, n))
.Where(n => n <= val && n > 0 && !candidates.Contains(n))
.Sum();
return Enum.TryParse((val - excess).ToString(), out asEnum) ? asEnum : default(TEnum);
}
Respondido 22 Feb 19, 01:02
10
Diferentes formas de emitir para y de Enum
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);
}
}
Respondido el 08 de enero de 14 a las 15:01
10
Ya no sé de dónde obtengo la parte de esta extensión de enumeración, pero es de stackoverflow. ¡Lo siento por esto! Pero tomé este y lo modifiqué para enumeraciones con Flags. Para enumeraciones con banderas hice esto:
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;
}
}
Ejemplo:
[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;
Respondido el 07 de enero de 16 a las 11:01
10
Puede ayudarlo a convertir cualquier dato de entrada al deseado por el usuario enumerar. Suponga que tiene una enumeración como la siguiente que, por defecto, int. Por favor agregue un Predeterminado valor al principio de su enumeración. Que se usa en el método de ayuda cuando no se encuentra ninguna coincidencia con el valor de entrada.
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: Aquí trato de analizar el valor en int, porque enum es por defecto int Si define una enumeración como esta, que es byte tipo.
public enum MediaType : byte
{
Default,
Audio,
Video,
Image
}
Debe cambiar el análisis sintáctico en el método auxiliar de
int.TryParse(value.ToString(), out tempType)
a
byte.TryParse(value.ToString(), out tempType)
Verifico mi método para las siguientes entradas
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);
lo siento por mi Inglés
respondido 17 nov., 16:12
10
La forma fácil y clara de convertir un int a enum en 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));
}
}
Respondido 13 Jul 20, 01:07
8
Simplemente usa Conversión explícita Cast int a enum o enum a int
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
}
}
Respondido 05 Abr '20, 10:04
7
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace SamplePrograme
{
public class Program
{
public enum Suit : int
{
Spades = 0,
Hearts = 1,
Clubs = 2,
Diamonds = 3
}
public static void Main(string[] args)
{
//from string
Console.WriteLine((Suit) Enum.Parse(typeof(Suit), "Clubs"));
//from int
Console.WriteLine((Suit)1);
//From number you can also
Console.WriteLine((Suit)Enum.ToObject(typeof(Suit) ,1));
}
}
}
Respondido 17 Oct 19, 08:10
6
Simplemente haz como a continuación:
int intToCast = 1;
TargetEnum f = (TargetEnum) intToCast ;
Para asegurarse de que solo transmite los valores correctos y que puede lanzar una excepción de lo contrario:
int intToCast = 1;
if (Enum.IsDefined(typeof(TargetEnum), intToCast ))
{
TargetEnum target = (TargetEnum)intToCast ;
}
else
{
// Throw your exception.
}
Tenga en cuenta que usar IsDefined es costoso e incluso más que solo convertir, por lo que depende de su implementación decidir si usarlo o no.
Respondido 27 Jul 19, 08:07
5
Simple, puedes convertir int a enum
public enum DaysOfWeeks
{
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6,
Sunday = 7,
}
var day= (DaysOfWeeks)5;
Console.WriteLine("Day is : {0}", day);
Console.ReadLine();
Respondido 14 Jul 20, 07:07
Si el elenco funcionara, no podría almacenarlo como int. - Ap.
Por favor, intente entender int to Enum, creo que la respuesta anterior es para ayudarlo. - Inam Abbas
4
Puede utilizar un método de extensión.
public static class Extensions
{
public static T ToEnum<T>(this string data) where T : struct
{
if (!Enum.TryParse(data, true, out T enumVariable))
{
if (Enum.IsDefined(typeof(T), enumVariable))
{
return enumVariable;
}
}
return default;
}
public static T ToEnum<T>(this int data) where T : struct
{
return (T)Enum.ToObject(typeof(T), data);
}
}
Úselo como el siguiente código:
enumeración:
public enum DaysOfWeeks
{
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6,
Sunday = 7,
}
Uso:
string Monday = "Mon";
int Wednesday = 3;
var Mon = Monday.ToEnum<DaysOfWeeks>();
var Wed = Wednesday.ToEnum<DaysOfWeeks>();
Respondido 13 Jul 20, 01:07
1
Necesito dos instrucciones:
YourEnum possibleEnum = (YourEnum)value; // There isn't any guarantee that it is part of the enum
if (Enum.IsDefined(typeof(YourEnum), possibleEnum))
{
// Value exists in YourEnum
}
Respondido 13 Jul 20, 01:07
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# enums casting int or haz tu propia pregunta.
@FlySwat, ¿y si
YourEnum
es dinámico y solo se conocerá en tiempo de ejecución, y lo que quiero es convertir aEnum
? - Shimmy WeitzhandlerTenga en cuenta que Enum.Parse NO funcionará si su código está ofuscado. En el tiempo de ejecución después de la ofuscación, la cadena se compara con los nombres de las enumeraciones y, en este punto, los nombres de las enumeraciones no son los que esperaría que fueran. Como resultado, su análisis fallará donde tuvo éxito antes. - jropella
TENER CUIDADO Si usa la sintaxis "de una cadena" anterior y pasa una cadena no válida que es un número (por ejemplo, "2342342", asumiendo que no es un valor de su enumeración), ¡realmente lo permitirá sin arrojar un error! Su enumeración tendrá ese valor (2342342) aunque no sea una opción válida en la enumeración en sí. - Joe fresco
Creo que esta respuesta está un poco anticuada ahora. Para cuerdas, realmente deberías usar
var result = Enum.TryParse(yourString, out yourEnum)
hoy en día (y verificando el resultado para determinar si la conversión falló). - justin t conroyTambién es posible tener
Enum.Parse
no distingue entre mayúsculas y minúsculas añadiendo untrue
valor del parámetro a la llamada:YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString, true);
- Erik Schierboom