2009-07-13 25 views
15

¿Hay alguna forma de poner espacios en una constante de C# enum? He leído que se puede hacer en VB al hacer esto:Espacios en C# Enums

Public Enum EnumWithSpaces 
    ConstantWithoutSpaces 
    [Constant With Spaces] 
End Enum 

... y luego acceder a ella de esta manera:

Public Sub UsingEnumWithSpaces() 

    Dim foo As EnumWithSpaces = EnumWithSpaces.[Constant With Spaces] 

End Sub 

Eso implica para mí que el CLR puede manejar una enumeración con espacios.

¿Hay alguna manera de hacer esto en C#?

Respuesta

36

Esta entrada de blog pueden ayudar:

http://blog.spontaneouspublicity.com/2008/01/17/associating-strings-with-enums-in-c/

Desde el artículo:

Pero enumeraciones no pueden tener espacios en C#" decís bien. , Me gusta usar el System.ComponentModel.DescriptionAttribute para agregar una descripción más amigable al los valores enum. El ejemplo de enumeración puede reescribirse así:

public enum States 
{ 
    California, 
    [Description("New Mexico")] 
    NewMexico, 
    [Description("New York")] 
    NewYork, 
    [Description("South Carolina")] 
    SouthCarolina, 
    Tennessee, 
    Washington 
} 

en cuenta que no pongo las descripciones de artículos donde la versión de ToString() que Muestra el Elemento bien.

+0

Gracias Judah por tratar de limpiar esto para mí. Estaba teniendo un gran problema tratando de que se vea bien. –

+2

Esto sería bueno si ToString utilizara automáticamente el atributo. Tal como están las cosas, sin embargo, no es tan útil. –

+0

Supongo que siempre puedes usar 'DescriptionAttribute' junto con un método de extensión' ToDescription'. – cdmckay

9

CLR puede manejar absolutamente cualquier carácter en los identificadores. Sin embargo, C# restringe los caracteres de identificación a aquellos legales bajo el CLS, que no es el espacio. Lo mismo ocurre con VB.NET, por cierto, los espacios entre corchetes se usan para trabajar en VB6, pero no en VB.NET.

+0

¿Hay alguna forma de modificar una constante enum utilizando la reflexión? – cdmckay

+0

¿Quiere decir cargar un ensamblado compilado y procesarlo para reemplazar los nombres enum o modificar la constante en tiempo de ejecución? Esto último no es posible; el primero es, pero creo que sería mucho más simple usar 'ildasm' para desmontarlo, reemplazar los nombres según sea necesario (esto se puede automatizar con expresiones regulares), y usar' ilasm' para hacer que sea un ensamblaje nuevamente. Alternativamente, puedes declarar tu enumeración en IL en primer lugar, usar 'ilasm' para compilarla en un módulo .net, y luego vincular ese módulo en tu ensamblado C#/VB. –

+0

Terminé simplemente usando 'DescriptionAttribute' y luego escribí mi propia clase estática para acceder a la enumeración como si las' DescriptionAttribute's fueran las constantes. – cdmckay

0

Si está trabajando con Visual C# 3.0 o superior He encontrado que es conveniente extender simplemente la clase de enumeración y utilizar una expresión regular a la inserción espacios donde lo necesite:

public static class EnumExtension 
{ 
    public static String ToDisplayString(this Enum e) 
    { 
     Regex regex = new Regex(@"([^\^])([A-Z][a-z$])"); 

     return regex.Replace(e.ToString(), new MatchEvaluator(m => 
     { 
      return String.Format("{0} {1}", m.Groups[1].Value, m.Groups[2].Value); 
     })); 
    } 
} 

Aviso esto le permite trabajar con cualquier enumeración como está sin agregar descripciones a cada valor.

String enumWithSpaces = MessageBoxButtons.OKCancel.ToDisplayString();