Avatar billede Slettet bruger
29. april 2009 - 23:33 Der er 7 kommentarer og
1 løsning

Permissions (bit håndtering)

Jeg vil forsøge at lave en måde hvorpå jeg nemt kan gemme permissions for en gruppe i databasen. Men jeg kan ikke helt få det her til at virke.

Ved forskellige kombinationer kommer visse permissions ikke med og jeg kan ikke se hvorfor. Er der nogen eksperter der ude der ved hvordan man laver sådan noget?

//1  - Full
//2  - Read
//4  - Edit/Delete Own
//8  - Edit/Delete Others
//16 - No Permissions
//32
//64
//128

            int permissions_on_item = 2 + 4 + 8 + 16;
            List<string> permission_array = new List<string>();
            List<string> returnArray = new List<string>();
            permission_array.Add("Full");
            permission_array.Add("Read");
            permission_array.Add("Edit/Delete Own");
            permission_array.Add("Edit/Delete Others");
            permission_array.Add("No Permissions");

            for(int i = 0; i < permission_array.Count; i++)
            {
                int test = (((int)Math.Pow(i + 1, 2)) | permissions_on_item);

                if (test == permissions_on_item)
                {
                    returnArray.Add(permission_array[i]);
                }
            }

            foreach (string p in returnArray)
            {
                Console.WriteLine(p);
            }

            Console.WriteLine("Done");
            Console.Read();
Avatar billede arne_v Ekspert
30. april 2009 - 01:06 #1
Prøv med:

if (permissions_on_item & (1 << i) != 0)
Avatar billede arne_v Ekspert
30. april 2009 - 01:06 #2
Har du overvejet at lave den med enum ??
Avatar billede arne_v Ekspert
30. april 2009 - 01:09 #3
Der manglede lige et par parenteser:

if ((permissions_on_item & (1 << i)) != 0)
Avatar billede arne_v Ekspert
30. april 2009 - 01:16 #4
using System;
using System.Collections.Generic;

namespace E20
{
    class Program
    {
        public static void Main(string[] args)
        {
            int permissions_on_item = 2 + 4 + 8 + 16;
            List<string> permission_array = new List<string>();
            List<string> returnArray = new List<string>();
            permission_array.Add("Full");
            permission_array.Add("Read");
            permission_array.Add("Edit/Delete Own");
            permission_array.Add("Edit/Delete Others");
            permission_array.Add("No Permissions");

            for(int i = 0; i < permission_array.Count; i++)
            {
                if ((permissions_on_item & (1 << i)) != 0)
                {
                    returnArray.Add(permission_array[i]);
                }
            }

            foreach (string p in returnArray)
            {
                Console.WriteLine(p);
            }

            Console.WriteLine("Done");
            Console.Read();        }
    }
}

versus

using System;
using System.Collections.Generic;

namespace E20
{
    [Flags] enum Perm { Full, Read, EditDelOwn, EditDelOther, No };
    class Program
    {
        public static void Main(string[] args)
        {
            Perm permissions_on_item = Perm.Read | Perm.EditDelOwn | Perm.EditDelOther | Perm.No;
            List<string> returnArray = new List<string>();
            foreach(Perm i in Enum.GetValues(typeof(Perm)))
            {
                if ((permissions_on_item & i) != 0)
                {
                    returnArray.Add(i.ToString());
                }
            }

            foreach (string p in returnArray)
            {
                Console.WriteLine(p);
            }

            Console.WriteLine("Done");
            Console.Read();        }
    }
}
Avatar billede Slettet bruger
30. april 2009 - 10:52 #5
Perfekt, jeg ville gerne bruge enum nemlig. Men hvordan gemmer jeg så værdien i databasen som tal? og hvordan oversætter jeg tallet til enums?

kan du komme med et lille eksempel på det. Tak
Avatar billede Slettet bruger
30. april 2009 - 13:47 #6
Okay at konvertere til int var nemt:

[Flags]
        enum Perm
        {
            None            = 0,
            Full            = 1,
            Read            = 2,
            EditDelOwn      = 4,
            EditDelOther    = 8,
            NoPermissions  = 16
        };

Convert.ToInt32(permissions_on_item)

men hvordan den anden vej?
Avatar billede Slettet bruger
30. april 2009 - 13:49 #7
Det var så også nemt:

Perm test = (Perm)31;

Arne smid et svar, tak for hjælpen!
Avatar billede arne_v Ekspert
30. april 2009 - 15:04 #8
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester