[C#]Enum naam ipv int

Pagina: 1
Acties:

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 15-04 15:52
Hallo,

Misschien een beetje een vage titel maar ik zal uitleggen wat ik bedoel.

Ik lees een transaction status uit van een andere applicatie.

Deze returned een int die overeen komt met een bepaalde Enummeratie waarde.

Bijv.

code:
1
2
3
4
5
enum TRState
{
Error = 1,
Busy=2,
}


etc.

Ik weet overigens niet welke waarde overeenkomt met welk enumeratie (misschien heeft iemand een tip hoe ik dit kan zien)

Nu wil ik dus ipv allerlei if statements meteen de enumeratie naar het scherm schrijven. dus als ik een 1 terug krijg dat ik als output krijg TRState.Error.

hoe kan ik dat doen?

dus ipv:
code:
1
2
3
4
5
if((int)_transaction.get_Status()==(int)TRState.Error)
                MessageBox.Show("transaction status=Error");
            else
                MessageBox.Show(_transaction.get_Status().ToString());
etc.. etc..


zoiets
code:
1
2
3
4
5
...hier moet ik iets doen?
_transaction.get_Satus()
...of hier?
MessageBox.Show(TRState);
etc.. etc..


Ik hoop dat het duidelijk is?

dank alvast!

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

.edit: bleh, dit is C#, ik dacht dat het een C++ topic was 8)7

[ Voor 90% gewijzigd door .oisyn op 27-10-2005 15:18 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:58
Een classje schrijven die er zo uitziet bv:

code:
1
2
3
4
5
6
7
8
9
10
11
12
public class TRStateUtils
{
    public static TRState GetTRStateFromInt( int value )
    {
         switch( value )
         {
              case  1 : return TRState.Error;
              case 2  : return TRState.Busy;
              default : throw new InvalidOperationException();
         }
    }
}

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Kan je niet gewoon zo doen
C#:
1
2
TRState status = (TRState)_transaction.get_Status();
MessageBox.Show( status.ToString() );


En dan eventueel gecombineerd met wat Whoami zegt aangezien je dan niet hoeft te casten.

[ Voor 29% gewijzigd door Woy op 27-10-2005 15:21 ]

“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.”


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 15-04 15:52
hmm ik heb het nu zo:

en het lijkt te werken... (klopt dit?)

code:
1
2
TRState test = (TRState)_transaction.get_Status();
MessageBox.Show(test.ToString());


of geeft dit later nog problemen?

ha ik zie dat iemand met dezelfde oplossing kwam :)

[ Voor 13% gewijzigd door 4of9 op 27-10-2005 15:22 ]

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het probleem is dat je dan wel moet zorgen dat je enum altijd goed is. Als je ook gebruik maakt van Whoami zijn oplossing dan kan je makkelijker ( en overzichtelijker ) wijzigingen maken aan de status codes.

“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.”


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 15-04 15:52
Ik maak die enum zelf niet, die komt uit een ander externe library.
Het gekke is dat ik in de object explorer niet kan zien wat de waardes zijn die bij de codes horen.

Ik zie dus wel:

TRState.Error

Maar niet dar Error bijvoorbeeld waarde 1 heeft.
en TRState.Timeout 6.

weet iemand hoe ik dat toch kan zien in de IDE?

Het is een com component (C++) dat ik gebruik via een reference in mijn project...

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • Hydra
  • Registratie: September 2000
  • Laatst online: 26-04 10:16
De reden dat je de inhoud van een enum niet ziet, is dat deze zo maar eens kan veranderen. Er is geen garantie dat als MyEnum.OptionA nu 1 is, hij dat ook daadwerkelijk blijft. Probeer danook zoveel mogelijk dit soort programmeren te vermijden.

Je kunt in princiepe een enum gewoon naar een int casten, mocht je hem als integer willen benaderen.

https://niels.nu


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Hydra schreef op donderdag 27 oktober 2005 @ 16:21:
De reden dat je de inhoud van een enum niet ziet, is dat deze zo maar eens kan veranderen. Er is geen garantie dat als MyEnum.OptionA nu 1 is, hij dat ook daadwerkelijk blijft. Probeer danook zoveel mogelijk dit soort programmeren te vermijden.

Je kunt in princiepe een enum gewoon naar een int casten, mocht je hem als integer willen benaderen.
IDD daarom kan je beter de manier van whoami toepassen. Dan zit de koppeling tussen de 2 verschillende datatypes op een plek en als er wat veranderd kun je het gewoon op een plek wijzigen.

“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...

C#:
1
string naam = Enum.GetName(typeof(TRState),nr)


dus voor '1' zal naam gelijk zijn aan "Error"

edit: oopsie foutje...

kun je niets met de methode Equals van Enum ?

C#:
1
2
3
4
5
foreach (TRState state in Enum.GetValues(typeof(TRState)))
{
   if (state.Equals(waarde))
        // gevonden!
}


uit de MSDN:
Return Value
true if obj is an Enum with the same underlying type and value as this instance; otherwise, false.

dus
je underlying type is een int -> true
de waarde is gelijk -> true
tadaaa...

[ Voor 67% gewijzigd door H!GHGuY op 27-10-2005 18:00 ]

ASSUME makes an ASS out of U and ME


  • Hydra
  • Registratie: September 2000
  • Laatst online: 26-04 10:16
rwb schreef op donderdag 27 oktober 2005 @ 16:36:
IDD daarom kan je beter de manier van whoami toepassen. Dan zit de koppeling tussen de 2 verschillende datatypes op een plek en als er wat veranderd kun je het gewoon op een plek wijzigen.
Nouja, je bent sowieso afhankelijk van die enum (die in een andere classlib zit) en de return waardes van die transacties. Als zowel die return waardes als die enum beheerd worden door de makers van die app/classlib kun je gewoon dit doen:

int returnwaarde = DoFunctionCall();
Enum value = (Enum)returnwaarde;

Maar dan vraag ik me af waarom die returnwaardes dan niet gewoon Enums zijn i.p.v. ints.

Die switch breekt net zo goed als de waardes domweg veranderen. Er een switch omheen bouwen heeft weinig zin, kapot gaat 't toch.

https://niels.nu


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Hydra schreef op donderdag 27 oktober 2005 @ 18:08:
[...]


Nouja, je bent sowieso afhankelijk van die enum (die in een andere classlib zit) en de return waardes van die transacties. Als zowel die return waardes als die enum beheerd worden door de makers van die app/classlib kun je gewoon dit doen:

int returnwaarde = DoFunctionCall();
Enum value = (Enum)returnwaarde;

Maar dan vraag ik me af waarom die returnwaardes dan niet gewoon Enums zijn i.p.v. ints.

Die switch breekt net zo goed als de waardes domweg veranderen. Er een switch omheen bouwen heeft weinig zin, kapot gaat 't toch.
Ja tuurlijk daar heb je gelijk in. Daarom zeg ik ook dat je het dan op een plek hoeft te veranderen. Als je beide returnwaardes beheert zou je IMHO dit probleem niet moeten hebben nee. Maar het zou natuurlijk best kunnen dat je geen van beide values beheert. En dan is de veiligste manier om het bijvoorbeeld met een switch te doen.

“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...

gebruik nou es even reflection (zoals in mijn voorbeeld...)

een enum kan gelijk welk type zijn voor zover ik weet..

C#:
1
2
3
4
5
enum myBlah
{
  blah = "blah",
  blah2="blah2",
}


is volgens mij correct...

dus moet je Enum.Equals() gebruiken

[ Voor 5% gewijzigd door H!GHGuY op 27-10-2005 18:17 ]

ASSUME makes an ASS out of U and ME


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
HIGHGuY schreef op donderdag 27 oktober 2005 @ 18:17:
gebruik nou es even reflection (zoals in mijn voorbeeld...)
Waarom zou je daarvoor reflection willen gebruiken. De ToString van een Enum is al zo geimplementeerd dat het doet wat je wilt
een enum kan gelijk welk type zijn voor zover ik weet..
C#:
1
2
3
4
5
enum myBlah
{
  blah = "blah",
  blah2="blah2",
}

is volgens mij correct...

dus moet je Enum.Equals() gebruiken
Volgens mij hoef je geen Equals te gebruiken bij enums. Alle mogenlijkheden zijn volgens mij namenlijk static ( Je doet immers ook geen new ) dus je verwijst altijd naar dezelfde instantie dus kan je gewoon met de == operator vergelijken. Je zou het volgens mij ongeveer zo kunnen zien.
C#:
1
2
3
4
5
6
7
8
9
public class MyBla
{
    public static readonly MyBla Value1 = new MyBla( "bla" );
    public static readonly MyBla Value2 = new MyBla( "bla2" );

    private object _value;

    public MyBla( object value ){ _value = value; }
}

Dit is echter speculatie dus ik weet het niet zeker.

“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...

ik weet niet of:

C#:
1
2
3
4
5
6
7
8
9
10
enum myblah
{
   blah = 1,
   andereblah = 2,
}

bool vergelijk(myblah bm, int i)
{
  return bm = i;
}


kan, en ik denk het eigenlijk niet...

want als je dit hebt:
C#:
1
2
3
4
5
6
7
8
9
10
enum myblah
{
  blah = "blah",
  andereblah = "andereblah"
}

bool vergelijk(myblah mb, int i)
{
  return mb == i; // vergelijking van string en int is niet geimplementeerd
}

krijg je rare dingen.

een enum kan namelijk eender welk onderliggend type hebben.
daarom staat er ook bij die Equals functie in de MSDN dat het onderliggend type gelijk moet zijn (int) en dat de waarde daarvan gelijk moet zijn.

een switch gebruiken is ook volledig hardcoded, terwijl mijn oplossing zonder de minste problemen uitbreidbaar is. (zonder code-aanpassing)

ASSUME makes an ASS out of U and ME


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Ik heb dan ook nog nooit strings in een enum gezien :?

Geen zin om het na te zoeken, maar bij het definieren van een enum moet je opgeven welk type de onderliggende representatie volgt en daar kan je dacht ik alleen maar uit geheeltallige numerieke typen kiezen (byte, short, int, long, misschien ook wel char).

C# kan automatisch converteren van een enum naar zijn onderliggende representatie (coercions). De andere kant op doet de compiler niet zomaar voor je, omdat hij op compile time niet kan nagaan of de runtime waarde in de onderliggende representatie wel een corresponderende enum-waarde heeft. De bewijslast daarvoor ligt bij de programmeur en om aan te geven dat je dat wilt, gebruik je een cast, bijv:

code:
1
2
int i = 3;
MyEnum e = (MyEnum) i;

[ Voor 106% gewijzigd door Infinitive op 27-10-2005 19:57 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
HIGHGuY schreef op donderdag 27 oktober 2005 @ 19:09:
ik weet niet of:

C#:
1
2
3
4
5
6
7
8
9
10
enum myblah
{
   blah = 1,
   andereblah = 2,
}

bool vergelijk(myblah bm, int i)
{
  return bm = i;
}

kan, en ik denk het eigenlijk niet...

want als je dit hebt:
C#:
1
2
3
4
5
6
7
8
9
10
enum myblah
{
  blah = "blah",
  andereblah = "andereblah"
}

bool vergelijk(myblah mb, int i)
{
  return mb == i; // vergelijking van string en int is niet geimplementeerd
}

krijg je rare dingen.
Ja dat klopt. Je zult zowiezo moeten casten en als het onderligende type anders is zul je waarschijnlijk een CastException krijgen.
een switch gebruiken is ook volledig hardcoded, terwijl mijn oplossing zonder de minste problemen uitbreidbaar is. (zonder code-aanpassing)
Zolang je zeker weet dat de codes overeenkomen met de value van je Enum kan je gewoon casten. Als je dat niet zeker weet kun je ook niet zoveel met reflection want je zult toch ergens een vertaling maken van je gegevens.

“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.”


  • Hydra
  • Registratie: September 2000
  • Laatst online: 26-04 10:16
rwb schreef op donderdag 27 oktober 2005 @ 18:10:
Ja tuurlijk daar heb je gelijk in. Daarom zeg ik ook dat je het dan op een plek hoeft te veranderen. Als je beide returnwaardes beheert zou je IMHO dit probleem niet moeten hebben nee. Maar het zou natuurlijk best kunnen dat je geen van beide values beheert. En dan is de veiligste manier om het bijvoorbeeld met
een switch te doen.
Het ging erom dat de situatie waarschijnlijk is dat zowel X en Y door A beheerd worden, waar A != OP. Dus als de vendor van de 'database' de return codes beheert, kun je die vergelijking gewoon in een cast doen.

Misschien moet de OP zich eens wat verder verduidelijken voordat we verder gaan speculeren :)

https://niels.nu


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

H!GHGuY

Try and take over the world...

gebruik nou gewoon die 4 regels code die ik je gaf en dan ben je voor ALTIJD zoet, en weet je gelijk ook dat het de enige verantwoorde manier is om er mee om te gaan, nu en naar de toekomst toe.

ASSUME makes an ASS out of U and ME


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
HIGHGuY schreef op vrijdag 28 oktober 2005 @ 23:51:
gebruik nou gewoon die 4 regels code die ik je gaf en dan ben je voor ALTIJD zoet, en weet je gelijk ook dat het de enige verantwoorde manier is om er mee om te gaan, nu en naar de toekomst toe.
Als de waardes overeen komen is dat idd een nette oplossing. Als de waardes niet overeen komen moet je toch ergens een mapping hebben.

“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...

rwb schreef op zaterdag 29 oktober 2005 @ 12:24:
[...]

Als de waardes overeen komen is dat idd een nette oplossing. Als de waardes niet overeen komen moet je toch ergens een mapping hebben.
nee, want als ze niet overeen komen, dan heb je ook geen gelijkheid 8)7

als je onderliggend type een float is, wil je niet hebben dat een int eraan kan gelijk zijn!
doe je het toch, dan ben je imo heel slecht bezig

[ Voor 6% gewijzigd door H!GHGuY op 29-10-2005 18:31 ]

ASSUME makes an ASS out of U and ME

Pagina: 1