[C#/2.0] Zoeken naar een enum field adh van DescriptionAttr

Pagina: 1
Acties:

  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
Hi :)

De situatie is simpel: ik heb een enumeration (System.Enum) en iedere enum-field heeft een attribute van het type DescriptionAttribute:

C#:
1
2
3
4
5
6
7
8
public enum Test
{
        [Description("Omschrijvng 1")]
        Descr1,
        [Description("Omschrijving 2")]
        Descr2,
        // etc.
}


Nu heb ik een string met de omschrijving van van DescriptionAttribute object, enwil ik de bijbehorende enum field vinden. Natuurlijk kan ik gebruik maken van een iterator (foreach) maar zou dit niet sneller kunnen? Is er misschien een methode die mij hierin kan helpen?

Bedankt. :)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je zult toch echt van alle Members de DescriptionAttribute op moeten vragen. Het is niet mogenlijk om direct op Properties van je Attribute te filteren.

Dus toch iets als het volgende
code:
1
2
3
4
5
Foreach( EnumMember )
{
    if( HasDescriptionAttribute && Description.Equals( omschrijving ) )
         //match
}

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

waarom wil je .NET nabouwen dan?

http://msdn2.microsoft.co.../system.enum_members.aspx

Er bestaat al een Parse() functie die je enum van string omzet naar de goeie waarde zonder reflection.

ASSUME makes an ASS out of U and ME


  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
Ik was er al bang voor. Bedankt. :)

  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
H!GHGuY schreef op vrijdag 18 mei 2007 @ 11:07:
waarom wil je .NET nabouwen dan?

http://msdn2.microsoft.co.../system.enum_members.aspx

Er bestaat al een Parse() functie die je enum van string omzet naar de goeie waarde zonder reflection.
Nee, dit is niet wat ik zoek. Want ik heb de descriptionAttribute en niet de enum-field. Ik moet juist de enum-field hebben, welke een relatie heeft met het descriptionAttr.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
In welke situatie zit je dat je de description attribute hebt maar NIET de enum value? Die description attributes zijn voor property grids, nergens anders voor.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
EfBe schreef op vrijdag 18 mei 2007 @ 11:20:
In welke situatie zit je dat je de description attribute hebt maar NIET de enum value? Die description attributes zijn voor property grids, nergens anders voor.
Het wordt gebruik voor een combobox welke de enum waarden laat zien. Maar dan laat ik niet de enum-velden zelf weergeven als items, maar de inhoud van DescriptionAttribute.Description van iedere enum-waarde. Dit descriptionAttr bied meer mogelijkheden als spaties e.d. Het vullen van combobox items uit het enum gebeurt bij het OnLoad event van het UC en werkt allemaal prima.

Het UC waar deze combobox op is geplaatst, heeft een eigenschap van een object met daarin de waarde van dat enum value. Je voelt hem misschien aankomen, ik zoek een manier dat bij het 'setten' van het object direct de juiste combobox item wordt geselecteerd volgens de enum-waarde. Dus moet ik een relatie hebben tussen dit enum-waarde en omschrijving welke aan combobox is opgegeven.

Hmm...misschien doe ik te complex merk ik nu maar dit is de situatie waar ik in ben beland. Andere tips, ideeen? Graag :)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je kan dan toch gewoon de waarde van de enum in je tag zetten? Dan heb je al helemaal geen probleem

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
rwb schreef op vrijdag 18 mei 2007 @ 11:33:
Je kan dan toch gewoon de waarde van de enum in je tag zetten? Dan heb je al helemaal geen probleem
Klopt, maar de combobox item collection accepteert alleen een object als argument. Niet een object als ListViewItem waar je dan wel een tag op kan geven.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Ah, ok maar dan los je het niet op zonder reflectie. Ik zou overigens gewoon de Enum waarde in de combo box laten zien, en dan gewoon die enum waarden fatsoenlijke namen geven: afkortingen in enum waarden etc. is sowieso not done.

Wat je ook kunt overwegen is een datatable te bouwen van je enum waarden (column 0) en de omschrijving (column 1) en die te binden aan je combobox.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
EfBe schreef op vrijdag 18 mei 2007 @ 11:41:
Ah, ok maar dan los je het niet op zonder reflectie. Ik zou overigens gewoon de Enum waarde in de combo box laten zien, en dan gewoon die enum waarden fatsoenlijke namen geven: afkortingen in enum waarden etc. is sowieso not done.

Wat je ook kunt overwegen is een datatable te bouwen van je enum waarden (column 0) en de omschrijving (column 1) en die te binden aan je combobox.
bedankt voor het meedenken :) Ik blijf bij mijn foreach iterator...

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

kun je ook niet naam-waarde paren in een combo-box stoppen ?

Description-Enum ?

ASSUME makes an ASS out of U and ME


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
H!GHGuY schreef op vrijdag 18 mei 2007 @ 14:23:
kun je ook niet naam-waarde paren in een combo-box stoppen ?

Description-Enum ?
Je zou idd iets als het volgende kunnen doen
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public ComboBoxItem<T>
{
      private T item;
      private string description;

      public ComboBoxItem( T item, string description ){
           this.item = item;
           this.description = description;
      }

      public override string ToString()
      {
          return description;
      }

      public T Item
      {
            get { return item; }
      }

      public string Description
      {
             get { return description; }
      }
}

En dan voor elke value zo'n item erin kunnen stoppen

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1