Asociar enumeraciones con cadenas en C#
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 OEM
y CMB
s). Me gustaría hacer de este campo enum
algo más comprensible. Porque si el objetivo es la legibilidad, la solución debería ser concisa.
¿Qué otras opciones tengo?
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);
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());
¿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?
}
}
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";
}
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.