Asociar enumeraciones con cadenas en C#

Resuelto Boris Callens asked hace 15 años • 40 respuestas

Sé que lo siguiente no es posible porque el tipo de enumeración tiene que ser un int

enum GroupTypes
{
    TheGroup = "OEM",
    TheOtherGroup = "CMB"
}

De mi base de datos obtengo un campo con códigos incompletos (the OEMy CMBs). Me gustaría hacer de este campo enumalgo más comprensible. Porque si el objetivo es la legibilidad, la solución debería ser concisa.

¿Qué otras opciones tengo?

Boris Callens avatar Mar 10 '09 22:03 Boris Callens
Aceptado

Me gusta usar propiedades en una clase en lugar de métodos, ya que se parecen más a una enumeración.

A continuación se muestra un ejemplo de un registrador:

public class LogCategory
{
    private LogCategory(string value) { Value = value; }

    public string Value { get; private set; }

    public static LogCategory Trace   { get { return new LogCategory("Trace"); } }
    public static LogCategory Debug   { get { return new LogCategory("Debug"); } }
    public static LogCategory Info    { get { return new LogCategory("Info"); } }
    public static LogCategory Warning { get { return new LogCategory("Warning"); } }
    public static LogCategory Error   { get { return new LogCategory("Error"); } }

    public override string ToString()
    {
        return Value;
    }
}

Pase valores de cadena con seguridad de tipos como parámetro:

public static void Write(string message, LogCategory logCategory)
{
    var log = new LogEntry { Message = message };
    Logger.Write(log, logCategory.Value);
}

Uso:

Logger.Write("This is almost like an enum.", LogCategory.Info);
Even Mien avatar Aug 27 '2009 20:08 Even Mien

También puedes usar el modelo de extensión:

public enum MyEnum
{
    [Description("String 1")]
    V1= 1,
    [Description("String 2")]
    V2= 2
} 

Tu clase de extensión

public static class MyEnumExtensions
{
    public static string ToDescriptionString(this MyEnum val)
    {
        DescriptionAttribute[] attributes = (DescriptionAttribute[])val
           .GetType()
           .GetField(val.ToString())
           .GetCustomAttributes(typeof(DescriptionAttribute), false);
        return attributes.Length > 0 ? attributes[0].Description : string.Empty;
    }
} 

uso:

MyEnum myLocal = MyEnum.V1;
print(myLocal.ToDescriptionString());
Glennular avatar Mar 10 '2009 15:03 Glennular

¿Qué tal usar una clase estática con constantes?

static class GroupTypes
{
  public const string TheGroup = "OEM";
  public const string TheOtherGroup = "CMB";
}

void DoSomething(string groupType)
{
  if(groupType == GroupTypes.TheGroup)
  {
    // Be nice
  }  
  else if (groupType == GroupTypes.TheOtherGroup)
  {
    // Continue to be nice
  }
  else
  {
    // unexpected, throw exception?
  }
}
rpattabi avatar Apr 15 '2011 09:04 rpattabi

Intente agregar constantes a una clase estática. No terminarás con un Tipo, pero tendrás constantes organizadas y legibles:

public static class GroupTypes {

    public const string TheGroup = "OEM";
    public const string TheOtherGroup = "CMB";

}
darasd avatar Mar 10 '2009 15:03 darasd

De hecho, puedes hacerlo muy fácilmente. Utilice el siguiente código.

enum GroupTypes
{
   OEM,
   CMB
};

Luego, cuando desee obtener el valor de cadena de cada elemento de enumeración, simplemente use la siguiente línea de código.

String oemString = Enum.GetName(typeof(GroupTypes), GroupTypes.OEM);

He usado este método con éxito en el pasado y también he usado una clase de constantes para mantener constantes de cadena; ambos funcionan bastante bien, pero tiendo a preferir esto.

Arthur C avatar Dec 05 '2009 15:12 Arthur C