[C#] Enum gebruiken als session key

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Kayshin
  • Registratie: Juni 2004
  • Laatst online: 09-03-2018

Kayshin

Bl@@T @@P!!!

Topicstarter
Hallo,

Voor een schoolproject zijn wij bezig met een .net pagina in C#. Omdat we vrij veel session variabelen gebruiken en op vrij veel plaatsen aanspreken leek het me een goed idee om deze session keys op te slaan in een enum:
code:
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
26
27
28
    public enum NSession : int
    {
        UserId = 0,
        UserCharacterId = 1,
        UserPermission = 2,
        CharacterGuiFirstLoad = 3,
        CombatState = 4,
        ChosenNPCId = 5,
        TempCharOxy = 6,
        TempNpcOxy = 7,
        TempCharConf = 8,
        LootListGUIFirstRun = 9,
        ChosenAllItem = 10,
        ChosenNPCItem = 11,
        ChosenNPC = 12,
        MapGUIRunFirst = 13,
        ShopID = 14,
        LocationID = 15,
        NPCGUIState = 16,
        ShopGUIState = 17,
        ChosenShop = 18,
        ChosenShopItem = 19,
        ShopGuiFirstShow = 20,
        SelectedSell = 21,
        SelectedBuy = 22,
        SkillGUIState = 23,
        ChosenSkill = 24,
    }


Zodat deze dan op de volgende manier gebruikt zou kunnen worden:

code:
1
2
3
if (Session[NSession.UserPermission] == 255){
doe van alles
}


Echter als ik dit wil builden krijg ik de volgende error:
Error 8 Argument '1': cannot convert from 'N3RDZ.NSession' to 'string'

Het probleem is dus dat hij de enum niet accepteert als valid key voor de session variabelen, wat op zich vrij logisch is, echter heb ik aangegeven dat de enum een int is, dus waarom ziet hij dit niet op deze manier?

My personal videoteek: -Clique-; -NMe- is een snol!


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:32

gorgi_19

Kruimeltjes zijn weer op :9

NSession.UserPermission.ToString()

Je kan echter echter een class aanmaken met daarin alleen static public const als string en deze gebruiken.

[ Voor 62% gewijzigd door gorgi_19 op 03-12-2009 11:16 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 20:53

Haan

dotnetter

Je hoeft niet specifiek aan te geven dat de enum een int is, dat is namelijk standaard zo ;)

Maar je moet wel expliciet een cast doen als je de int waarde wilt gebruiken, dus:
C#:
1
2
3
4
if (Session[(int)NSession.UserPermission] == 255)
{
//bla
}

Dan krijg je alleen vermoedelijk een foutmelding dat je een int gebruikt in plaats van string, dus moet je die nog ToString() doen..

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:37
Omdat hij een string verwacht (lees de foutmelding).
Check hoe die indexer van Session (Session[]) er uit ziet.

Ipv enums zou je ervoor kunnen kiezen om const strings te gebruiken.
En de toegang tot je Session object te encapsuleren.

Of, een combo van beiden.
Maak een eigen class die je access verschaft tot je Session object, gebruik jouw enum om dat af te handeleen, en in je eigen class, ga je die enum gaan omzetten naar de passende const string die je gebruikt als key binnen het Session object.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MySession
{
    public string this[MyEnum key]
    {
         get {return Session[GetStringFromKey(key)]; }
         set { ... }
    }

    private string GetStringFromKey( MyEnum key )
    {
              return key.ToString();
    }
}


Of, wat gorgi zegt:

code:
1
2
3
4
5
6
7
8
public class MySession
{
     public int PlayerId
     {
            get { return Convert.ToInt32 ( Session["playerid"] );
            set {... }
     }
}
Heb je ook meteen typed access.

[ Voor 33% gewijzigd door whoami op 03-12-2009 11:21 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Blijkbaar verwacht Session een string als waarde voor de index. Dus zoiets:

C#:
1
Session["message"] = "Hello World";


Op de plaats van "message" stop jij nu iets anders.

Verder lees ik nog het volgende: http://msdn.microsoft.com/en-us/library/sbbt4032(VS.80).aspx
The underlying type specifies how much storage is allocated for each enumerator. However, an explicit cast is needed to convert from enum type to an integral type.
Dus wellicht dat dit werkt:

C#:
1
2
3
if (Session[(int)NSession.UserPermission] == 255){
  // doe iets
}

Acties:
  • 0 Henk 'm!

  • wboevink
  • Registratie: September 2004
  • Laatst online: 07-06 23:30
Omdat Session[....] een string verwacht

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 18:39

Matis

Rubber Rocket

wboevink schreef op donderdag 03 december 2009 @ 11:18:
Omdat Session[....] een string verwacht
Daarop inhaken:
http://msdn.microsoft.com/en-us/library/aa287606(VS.71).aspx

Als voorbeeld staat er
C#:
1
2
if (Session["City"] == null) 
    Response.Write("No such value in session state.");

Hieruit blijkt dus dat hij een string verwacht. Je moet je enum dus casten naar een string, of misschien kun je de keyvalue meegeven aan die waarde, maar dat weet ik niet.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Kayshin
  • Registratie: Juni 2004
  • Laatst online: 09-03-2018

Kayshin

Bl@@T @@P!!!

Topicstarter
Session[] kan ook een index (int) verwachten. dat is (vind ik :P) dus het vreemde.

Als ik de code gebruik die hierboven staat (met (int) ervoor) krijg ik een andere error:
Error 1 Operator '==' cannot be applied to operands of type 'object' and 'int'

Zal eens kijken of ik dat op kan lossen.

My personal videoteek: -Clique-; -NMe- is een snol!


Acties:
  • 0 Henk 'm!

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 20:55
Doe dit niet.

Als je een enum wilt gebruiken, gebruik dan één session variable waarin je de rechten als bitmask van de enum opslaat (zoek op FlagsAttribute).

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:37
Kayshin schreef op donderdag 03 december 2009 @ 11:22:
Session[] kan ook een index (int) verwachten. dat is (vind ik :P) dus het vreemde.
Ik zou dat toch maar eens goed nalezen in de MSDN, want die indexer zal zich wel iets anders gedragen dan de Item(string s) indexer ...
Als ik de code gebruik die hierboven staat (met (int) ervoor) krijg ik een andere error:
Error 1 Operator '==' cannot be applied to operands of type 'object' and 'int'

Zal eens kijken of ik dat op kan lossen.
...

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Kayshin
  • Registratie: Juni 2004
  • Laatst online: 09-03-2018

Kayshin

Bl@@T @@P!!!

Topicstarter
code:
1
if ((int)Session[(int)NSession.UserPermission] == 255)

Did the trick XD

My personal videoteek: -Clique-; -NMe- is een snol!


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 20:53

Haan

dotnetter

Kayshin schreef op donderdag 03 december 2009 @ 11:22:
Session[] kan ook een index (int) verwachten. dat is (vind ik :P) dus het vreemde.

Als ik de code gebruik die hierboven staat (met (int) ervoor) krijg ik een andere error:
Error 1 Operator '==' cannot be applied to operands of type 'object' and 'int'

Zal eens kijken of ik dat op kan lossen.
Dat komt omdat Session[index] een object terug geeft ;) Je zal dus de Equals() methode moeten gebruiken.
Maar zoals gezegd is dit niet de fraaiste manier om je probleem uiteindelijk op te lossen en zijn er een aantal betere alternatieven gegeven.
Kayshin schreef op donderdag 03 december 2009 @ 11:25:
code:
1
if ((int)Session[(int)NSession.UserPermission] == 255)

Did the trick XD
Dat het compiled betekent niet meteen dat het ook een goede oplossing is hè :X

[ Voor 17% gewijzigd door Haan op 03-12-2009 11:27 ]

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Kayshin
  • Registratie: Juni 2004
  • Laatst online: 09-03-2018

Kayshin

Bl@@T @@P!!!

Topicstarter
creator1988 schreef op donderdag 03 december 2009 @ 11:23:
Doe dit niet.

Als je een enum wilt gebruiken, gebruik dan één session variable waarin je de rechten als bitmask van de enum opslaat (zoek op FlagsAttribute).
Het gaat niet alleen om de rechten, we weten hoe bitmasking e.d werkt. Het gaat mij er alleen om dat ik op een eenvoudige manier mijn sessie variabelen overal kan aanspreken zonder dat ik de mogelijkheid heb om een fout te maken met het typen van de keys.

My personal videoteek: -Clique-; -NMe- is een snol!


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:37
Kayshin schreef op donderdag 03 december 2009 @ 11:25:
code:
1
if ((int)Session[(int)NSession.UserPermission] == 255)

Did the trick XD
Weet dat je hier niet op 'key' gaat gaan zoeken in je sessionstate hé ...

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Als je toch al een MySession class gaat maken, vergeet dan de enumeraties en gebruik dan de enum members als property naam en plaats vervolgens het object in de sessie.

Je hebt dan veel minder last van boxing omdat je alleen het MySession oject hoeft te casten. De rest is al strong-typed en hoeft dus niet meer gecast te worden.

C#:
1
2
3
4
5
6
public class SessionSettings
{
  public string TemplateSkin { get; set; }
  ...
  public int UserPermission { get; set; } 
}


Vanuit de page:
C#:
1
2
3
4
5
6
7
8
9
10
SessionSettings settings = Session(Constants.SessionSettingsKey) as SessionSettings;
if (settings == null)
{
  //no settings in session. Throw exception or create default settings
}

if (settings.UserPermission == 255) 
{
  //do something
}

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 20:55
Gooi gewoon een prop in je BasePage die je bitmask retrieved. dan kan je die gewoon altijd gebruiken als

if(UserSettings.Blabla)

werkt meteen op al je pages. Beetje ala Niemand_Anders maar dan gewoon generiek. Dit soort dingen nooit overlaten aan je individuele pages want dat gaat grandioos mis.

Acties:
  • 0 Henk 'm!

  • Maxxi
  • Registratie: Mei 2004
  • Laatst online: 19-04 19:18
Je kan toch gewoon Enum strings maken?

En deze als key gebruiken?

Acties:
  • 0 Henk 'm!

Verwijderd

Je kunt ook een extension method maken voor HttpSessionState:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
public static class HttpSessionStateExtensions
{
    public static object GetValue(this HttpSessionState session, NSession key)
    {
        return session[(int)key];
    }

    public static void SetValue(this HttpSessionState session, NSession key, object value)
    {
        session[(int)key] = value;
    }
}


En gebruik is heel mooi:

C#:
1
2
3
4
protected void Page_Load(object sender, EventArgs e)
{
    Session.GetValue(NSession.Test);
}


Vereist wel C# 3.0 compiler.
Pagina: 1