Avatar billede lasserasch Juniormester
02. juni 2007 - 23:53 Der er 14 kommentarer og
1 løsning

Finde alle statiske int32 variabler på en form.

Hejsa.

Kan det lade sig gøre fra en anden form at finde alle statiske public variabler som er Int32 variabler og som starter med navnet "R_" uden "" selvfølgelig.

Har min hovedform hvor tildelte rettigheder til brugeren sættes ud fra om en Int32 værdi er 1 eller 0. Alle disse værdier hedder R_(et eller andet).


Har så en login form, hvor jeg gerne vil lave et systemadministrations password. En slags bagdør i mit program hvor jeg ved at taste et bestemt langt password ville få alle rettigheder.

Men i stedet for at gøre det sådan her :

if (tb_passw.Text == "testpass")
{
frm_main.R_rettighed1 = 1;
frm_main.R_rettighed2 = 2;
frm_main.R_rettighed3 = 3;
ect...
}

Kunne jeg godt tænke mig at lave en løsning hvor jeg søgte frm_main igennem for alle værdier der statede med navnet R_ og så for hver fundet værdi sætte værdien = 1.

Nogen forslag?

/Lasse
Avatar billede thesurfer Nybegynder
02. juni 2007 - 23:59 #1
Hvorfor ikke bruger objekt orienteret programmering, når C# nu kan sådan noget..? :-)

Eksempel:

Du har et objekt, der indeholder:
R1, R2, R3

Så kan du spørge til:

obj.R1, obj.R2, obj.R3


Har du arbejdet med objekter/klasser før?
Avatar billede arne_v Ekspert
03. juni 2007 - 00:05 #2
Du kan godt via reflection tilgå alle fields/properties på en vilkårlig anden klasse.

Jeg kan godt finde et eksempel.

Men om det er nødvendigt er jeg også tvivlende overfor.
Avatar billede lasserasch Juniormester
03. juni 2007 - 00:06 #3
Hehe.... Ved ikke om du har set nogle af mine sidste spørgsmål. Der spurgte jeg lidt ind til hvad man skulle forstå under objektorienteret programmering.

Gav op til sidst. Det blev mere forvirrende end det gjorde gavn.

Men det lyder da spændende hvad du siger. Men forstår ikke umiddelbart hvordan jeg kan bruge det?

Min ide er at jeg gerne ville undgå at skulle skrive hver eneste R_.... på hver linie som overstående.

Ville hellere hvis man kunne lave noget ala :

foreach (Int32 I on frm_main.Ints)
{
I = 1;
}

Men det kan måske ikke lade sig gøre eller hvordan?

/Lasse
Avatar billede lasserasch Juniormester
03. juni 2007 - 00:10 #4
Tænkte at man godt kunne dette, da man jo godt kan finde alle controls f.eks. Og så tjekke på om navnet starter med noget bestemt og så arbejde med det.

/Lasse
Avatar billede arne_v Ekspert
03. juni 2007 - 00:12 #5
Du kan godt med refelction men den objektorienterede måde ville være at den anden
klasse havde en metode:

public void SetAllR(int V)

som man kunne kalde !
Avatar billede lasserasch Juniormester
03. juni 2007 - 00:18 #6
Jo arne, men kan stadig ikke se hvad der så skulle ske i SetAllR?

Det er jo den del jeg mangler.

Jeg ville bare gerne undgå at skulle vide hvad alle rettighedsvariablerne på frm_main hedder. Ville gerne kunne lede efter alle Int32 variabler som starter med R_
og så for hver af disse jeg måtte finde sætte værdien = 1.

/Lasse
Avatar billede thesurfer Nybegynder
03. juni 2007 - 00:25 #7
Simpelt eksempel..

Du har en klasse, der hedder "Person". Klassen indeholder 2 attributter: fornavn, efternavn

class Person()
{
    private string fornavn = "";
    private string efternavn = "";
    public Person(string fnavn, string enavn)
    {
        this.fornavn = fnavn;
        this.efternavn = enavn;
    }

    public string Fornavn
    {
        get { return this.fornavn; }
        set { this.fornavn = value; }
    }

    public string Efternavn
    {
        get { return this.efternavn; }
        set { this.efternavn = value; }
    }
}

Du opretter en instans af den, ved at bruge:

Person p = new Person("Hans", "Hansen");

Objektet har nu fået reference "p", som vi kan bruge, til at manipulere objektet..

Eksempel:

MessageBox.Show("Fornavn: " + p.Fornavn);

Vi kan også ændre på attributterne..

F.eks. skifter personen efternavnet til "Jensen".. Det gøres sådan her:

p.Efternavn = "Jensen";

Så tester vi igen: MessageBox.Show("Fornavn: " + p.Fornavn);


PS:
Det her er skrevet i en ganske almindelig teksteditor, så der kan være syntax fejl (og Copy&Paste fejl).. :-)
Avatar billede arne_v Ekspert
03. juni 2007 - 00:25 #8
Det er vel ikke et problem at SelAllR i klasse X faktisk kender fields i klasse X ?
Avatar billede arne_v Ekspert
03. juni 2007 - 00:26 #9
men hvis du vil igang med reflction så:

using System;
using System.Reflection;

public class MainClass
{
    public static void DynSet(Object o, string[] vals)
    {
        FieldInfo[] fields = o.GetType().GetFields();
        for(int i = 0; i < fields.Length; i++)
        {
            fields[i].SetValue(o, vals[i]);
        }
    }
    public static void Main(string[] args)
    {
        A a = new A();
        string[] vals = { "a", "bb", "ccc" };
        DynSet(a, vals);
        Console.WriteLine(a.a + " " + a.b + " " + a.c);
    }
}

public class A
{
    public string a;
    public string b;
    public string c;
}
Avatar billede thesurfer Nybegynder
03. juni 2007 - 00:27 #10
Rettelse:

p.Efternavn = "Jensen";

Så tester vi igen: MessageBox.Show("Nyt efternavn: " + p.Efternavn);
Avatar billede arne_v Ekspert
03. juni 2007 - 00:27 #11
og:

using System;
using System.Reflection;

class MainClass
{
    public static void Main(string[] args)
    {
        A a = new A();
        B b = new B();
        Display(a);
        Display(b);
    }
    public static void Display(object o)
    {
        Console.WriteLine("This is a " + o.GetType().Name);
        MemberInfo[] members = o.GetType().GetMembers();
        foreach(MemberInfo member in members)
        {
            if(member.MemberType == MemberTypes.Field)
            {
                int var = (int)o.GetType().InvokeMember(member.Name,
                                                        BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField,
                                                        null,
                                                        o,
                                                        null);
                Console.WriteLine(member.Name + " = " + var);
            }
        }
    }
}

class A
{
    public int var1 = 10;
}

class B
{
    public int var2 = 100;
}
Avatar billede lasserasch Juniormester
03. juni 2007 - 01:58 #12
Yes.... Takker for hjælpen. Dette blev resultatet, som virker super for mig. Ikke helt så lang en kode som du skrev arne, men det satte mig på det rette spor.

Smid et svar.

Til thesurfer, takker også her... Jeg bør seriøst sætte mig super meget ind i objekt orienteret programmering endag. Måske et V.U.C aftenkursus ;-)

Men ikke lige idag.

/Lasse

---------

        public void SetTotalSysAccess()
        {
            object o = new frm_main();
            FieldInfo[] fieldinfo = o.GetType().GetFields();
   
            foreach (FieldInfo member in fieldinfo)
            {
                if (member.IsStatic)
                {
                    if (member.Name.StartsWith("R_"))
                        member.SetValue(member, 1);
                }
            }
        }

--------
Avatar billede arne_v Ekspert
03. juni 2007 - 02:26 #13
svar
Avatar billede arne_v Ekspert
03. juni 2007 - 02:27 #14
Du bør absolut kigge på noget mere OO. Reflection er et interessant værktøj, men
efter min bedste overbevisning ikke det rette værktøj til denne opgave.
Avatar billede arne_v Ekspert
07. august 2007 - 22:44 #15
Så mangler du bare at acceptere svaret.
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