Gå til innhold

Forandre tittel på felt i en enum


Anbefalte innlegg

Hei!

 

Driver med en IDE for D nå, og skal legge til at man kan bruke andre linkere en Digital Mars sin.

 

Jeg har en enum som ser slik ut:

public enum OutputType
{
 WinExe,
 WinSys,
 Com,
 Elf,		
 Binary
}

 

Det som hadde vært fint, var om disse dukket opp med andre navn i property griden, noen navn som er litt mer beskrivende, gjerne med mellomrom.

 

Med en vanlig egenskap kan man legge til attributten [system.ComponentModel.DisplayName] men denne fungerer ikke på enum felt...

Det er ikke dødsviktig, men det ville økt brukervennligheten av programmet litt.

 

Noen som har noen idé om dette engang er mulig?

Lenke til kommentar
Videoannonse
Annonse
Med en vanlig egenskap kan man legge til attributten [system.ComponentModel.DisplayName] men denne fungerer ikke på enum felt...

Det er ikke dødsviktig, men det ville økt brukervennligheten av programmet litt.

 

Noen som har noen idé om dette engang er mulig?

 

Hva med å bare lage din egen DisplayNameAttribute? Eller du kan bruke System.ComponentModel.DescriptionAttribute som har AttributeTargets.All satt.

Lenke til kommentar

Det er veldig lett å lage egne attributer. Kall klassen din noe som slutter på Attribute (ikke nødvendig, men lurt), arv fra System.Attribute og sleng på AttributeTargets (heller ikke nødvendig, men lurt). Så bruker du litt reflection for å plukke ut det du trenger, det er vel Type.GetCustomAttributes() som er veien å gå hvis jeg ikke husker feil.

 

I den forrige jobben lagde vi et veldig artig rammeverk er attributter var en viktig del av bruken av rammeverket. Veldig kjekt og veldig gøy, og dessuten ble det fin veldig fin kode av det.

 

Men nå har jeg hoppa av .net-karusellen... Savner det dog innimellom :)

Lenke til kommentar

haha! :D nei

 

Har jobbet litt med dvorient btw...

 

men anyways, prosessoren er løs, og jeg gidder ikke kjøpe ny kjøling og strømforsyning på en 4 år gammel PC, så jeg skal skaffe meg en ny tellemaskin med kulehode og rettetast, og flere decibel med RAM pluss et hundretalls Megamann med Rom.

Lenke til kommentar
men anyways, prosessoren er løs, og jeg gidder ikke kjøpe ny kjøling og strømforsyning på en 4 år gammel PC, så jeg skal skaffe meg en ny tellemaskin med kulehode og rettetast, og flere decibel med RAM pluss et hundretalls Megamann med Rom.

 

Du kan kjøpe min Intel [email protected] MHz, 640 KB, CGA (320x200x4bpp), 2 cartridges ports (64 KB), RS232, Joystick, 5.25'' (360 KB), MSDOS 2.1. :thumbup:

Lenke til kommentar

Måten jeg har valgt å gjøre det på er å lage en klasse, kalt EnumDescriptionAttribute, som gir deg muligheten til å legge et attributt på feltene i enum'en din.

 

    /// <summary>
   /// Provides a description for an enumerated type.
   /// </summary>
   [AttributeUsage(AttributeTargets.Enum | AttributeTargets.Field, AllowMultiple = false)]
   public sealed class EnumDescriptionAttribute : Attribute
   {
       /// <summary>
       /// Gets the description stored in this attribute.
       /// </summary>
       /// <value>The description stored in the attribute.</value>
       public string Description { get; private set; }

       /// <summary>
       /// Initializes a new instance of the
       /// <see cref=”EnumDescriptionAttribute”/> class.
       /// </summary>
       /// <param name=”description”>The description to store in this attribute.</param>
       public EnumDescriptionAttribute(string description) : base()
       {
           Description = description;
       }
   }

 

Deretter har jeg laget en klasse, kalt EnumHelper, som bruker reflection til å hente ut verdien

 

    /// <summary>
   /// Provides a static utility object of methods and properties to interact
   /// with enumerated types.
   /// </summary>
   public static class EnumHelper
   {
       /// <summary>
       /// Gets the <see cref="DescriptionAttribute" /> of an <see cref="Enum" /> type value.
       /// </summary>
       /// <param name="value">The <see cref="Enum" /> type value.</param>
       /// <returns>A string containing the text of the
       /// <see cref="DescriptionAttribute"/>.</returns>
       public static string GetDescription(Enum value)
       {
           if (value == null)
               throw new ArgumentNullException("value");
           string description = value.ToString();
           FieldInfo fieldInfo = value.GetType().GetField(description);
           EnumDescriptionAttribute[] attributes = (EnumDescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(EnumDescriptionAttribute)
false);
           if (attributes != null && attributes.Length > 0)
               description = attributes[0].Description;

           return description;
       }

       /// <summary>
       /// Converts the <see cref="Enum" /> type to an <see cref="IList" /> compatible object.
       /// </summary>
       /// <param name="type">The <see cref="Enum"/> type.</param>
       /// <returns>An <see cref="IList"/> containing the enumerated
       /// type value and description.</returns>
       public static IList ToList(Type type)
       {
           if (type == null)
               throw new ArgumentNullException("type");
           ArrayList list = new ArrayList();
           Array enumValues = Enum.GetValues(type);
           foreach (Enum value in enumValues)
               list.Add(new KeyValuePair<Enum, string>(value, GetDescription(value)));

           return list;
       }
   }

 

Nå gjenstår kun å binde verdiene til kontrollen du vil ha.

 

DropDownList ddl = new DropDownList();
ddl.DataSource = EnumHelper.ToList(typeof(MinEnum));
ddl.DisplayMember = “Value”;
ddl.ValueMember = “Key”;

Endret av gatepoet
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...