Enums in set finta

Ejla!
Mene pa zanima o možnosti set-a oziroma union-a, intersecta nad enumeracijo.
Mas primer:
enum TestType
{
        TEST1,
        TEST2
}

enum Union
{
       USAGE=TEST1 | TEST2,
       NON_USAGE=TEST2
}











Potem lahko naredim takole:
TestType test = (TestType)USAGE;

Zanima me, kaj on vzame, ko naredim zgornji primer? TEST1 ali TEST2? Kako naj vem, da sem dobil recimo TEST2. Moram še posebej preverjat? Al to naredim prej v kodi? Recimo, da naredim nekje v kodi Union.USAGE=TestType.TEST2.....

Druga finta, ki me zanima, je pa, kakšna je razlika med Enum.Parse pa med EnumConverter razredom?











Avtor: bojanv, objavljeno na portalu SloDug.si (Arhiv)

Leave a comment

Please note that we won't show your email to others, or use it for sending unwanted emails. We will only use it to render your Gravatar image and to validate you as a real person.

AndrejT
AndrejT - četrtek, 03. avgust 2006

Deklaracija: [Flags]public enum Cats{     Black = 1, White = 2, Orange = 4} Testi: Cats cat = Cats.Black | Cats.White; // OK - unionCats cat2 = (Cats)3; // OK, casting iz numerične reprezentacijeCats cat3 = (Cats)Enum.Parse(typeof(Cats), "Black, White"); // OK, casting iz opisne reprezentacije Cats cat4 = (Cats)Enum.Parse(typeof(Cats), "3"); // OK, podobno kot cat2+cat3 - numerična reprezentacija, vendar podana kot stringCats cat5 = (Cats)"Black, White"; // NOK, se niti ne prevede Zaključek - direktni casting dela z bazičnem tipom (int oz. nek numerični tip), metoda Parse je bolj univerzalna, saj obvlada tako numerične, kot tudi opisne vrednosti (oboje vključno z zaobjetimi-union vrednostmi) EnumConverter obvlada podobno kot Enum.Parse: Cats cat6 = (Cats)TypeDescriptor.GetConverter(typeof(Cats)).ConvertFrom("Black, White");Cats cat7 = (Cats)TypeDescriptor.GetConverter(typeof(Cats)).ConvertFrom("3"); , ker pa gre tu za TypeConverter, zna verjetno še kakšen trik več (pretvorbe med različnimi interpretacijami Enumov), če pa želiš, ga lahko podobnih trikov naučiš tudi sam (z razširitvijo). Andrej

bojanv
bojanv - sreda, 02. avgust 2006

Kul, thnx...ena kratica več ...

ExAmigan
ExAmigan - sreda, 02. avgust 2006

Hope This Helps?

bojanv
bojanv - torek, 01. avgust 2006

Flage poznam, sem že delal z njimi. Zgornji primer je bil le za ilustracijo. Zanimalo me je, če lahko grupiraš glede na tip. Zdaj, ko pomislim, je zgornji primer logičen. A kaj češ, če nekdo ne napiše in zadeve ne premisliš, ne vidišHvala MihaM za lep primer uporabe. Kaj pomeni HTH? Zanima me še, kdaj je kaj boljše uporabit? Ali direkten cast (da dobiš Enum), torej (TestType)nekoStevilo, ali Enum.Parse (generična zadeva tukaj) z typeof ali pa EnumConverter? Z zadnjim konverterjem se nisem delal pa me zanima, če se ga splača uporabljat? Ma kdo izkušnje s tem?

MihaM
MihaM - torek, 01. avgust 2006

Enumi so interno vedno predstavljeni kot cele številke in seveda lahko poljubno delaš casting, le pozoren moraš biti na možnost, da vrednost ne ustreza enumu. Za tvoj primer velja pa tole:enum TestType{        TEST1,   // = 0        TEST2    // = 1}enum Union{       USAGE=TestType.TEST1 | TestType.TEST2, // = 0|1 = 1       NON_USAGE=TestType.TEST2      // = 1} Union.USAGE=TestType.TEST2 pa ne bo šlo. Boš moral: Union.USAGE=(Union)TestType.TEST2.....Pa še par stvari: če uporabljaš enum vrednosti kot zastavice, je pametno to označiti z atributom Flags in glej da bodo vrednosti ustrezne (0, 1, 2, 4, 8, 16, ...) Ne vidim potreben po ločenem Union v tvojem primeru. Usage in Non_usage lahko daš kar v TestType HTH

spirit1
spirit1 - ponedeljek, 31. julij 2006

test postane zadnji v enum ki nastopa v or-u, torej test2. z typeconverterji se pa nisem prevec igral, tak da niti ne vem kaj tocno pocnejo. ok sklepam da kovertirajo iz enega tipa v drugega