Avatar billede fuxi Nybegynder
05. februar 2006 - 16:13 Der er 7 kommentarer og
1 løsning

Dynamisk funktionskald med Assembly

Hejsa

Jeg har arbejdetlidt med assembly i forbindelse med at jeg har nogle funktioner jeg vil have kaldt dynamisk, det vil sige at jeg har gemt mine funktionsnavne i en database og kan kalde dem via min kode. Jeg har et meget simplificeret eksempel (taget fra et andet spørgsmål her på eksperten). Mit nye problem er at jeg har en funktion der tager en anden klasse ind som argument. F.eks. MinInputKlasse, denne klasse har således nogle variabler som jeg gerne vil kunne udfylde. Normalt kan jeg gøre følgende: 
MinInputKlasse.navn = "Peter";
MinInputKlasse.id = 12;

Hvordan overfører jeg det til min kode som jo gerne skulle kunne gøre det dynamisk?



using System;

public class DinKlasse
{
    public void DinMetode()
    {
        Console.WriteLine("Det virker");
    }
    public void DinAndenMetode(int iv, string sv)
    {
        Console.WriteLine(iv + " " + sv);
    }
}

og

using System;
using System.Reflection;

public class TestKlasse
{
    public static void Main(string[] args)
    {
        Object o = Assembly.Load("DinAssembly").CreateInstance("DinKlasse");
        o.GetType().InvokeMember("DinMetode", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, o, null);
        Object[] margs = { 123, "ABC" };
        o.GetType().InvokeMember("DinAndenMetode", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, o, margs);
    }
}
Avatar billede fuxi Nybegynder
05. februar 2006 - 16:15 #1
lige et kort eksempel:

public string minFunktion(MinInputKlasse mitInput)

kunne være mit funktionshoved... Hvoran får jeg udfyldt MinInputKlasse ud fra ovenstående kode?
Avatar billede arne_v Ekspert
05. februar 2006 - 17:30 #2
MinInputKlasse o = new MinInputKlasse();
o.navn = "Peter";
o.id = 12;
Object[] margs = new object[1];
margs[0] = o;

og saa kald med margs
Avatar billede fuxi Nybegynder
05. februar 2006 - 18:39 #3
Hej Arne

Ok jeg har vist ikke formuleret mig helt godt nok... Problemet er at MinInputKlasse også er fuldt dynamisk og skal kaldes på en lignende måde som min funktion.
Det vil sige at jeg ikke vil kunne lave MinInputKlasse da jeg ikke kender den som udgangspunkt.

jeg forestiller mig at jeg har en database hvori jeg kan læse hvad den klasse hedder som jeg skal bruge som input til min funktion. Ydermere kan jeg ud fra databasen, se hvilke attributter MinInputKlasse har. På den måde vil jeg kunne lave alt dynamisk.
MEN jeg ved ikke hvordan jeg skal gøre det i praksis, jeg formoder at det må minde om den måde at jeg kan tilgå en funktion på.

public class MinInputKlasse
{
  public int id = 0;
  public string navn = "Peter";
}

normalt ville jeg gøre det som du har vist i eksemplet, da min inputs klasse jo kun er defineret i databasen.
Jeg håber at du forstår hvad jeg mener, den er lidt tricky at forklare.
Avatar billede arne_v Ekspert
05. februar 2006 - 18:46 #4
saa instantierer du et objekt udfra en streng med navnet

og saa saetter du de fields/properties v.h.a. reflection
Avatar billede fuxi Nybegynder
05. februar 2006 - 18:48 #5
Nu er jeg slet ikke stærk i dette her, så hvis du har et eksempel eller et link til et eksempel så ville jeg være meget glad. Eksempler er bedre en 100 ord :O)
Avatar billede arne_v Ekspert
05. februar 2006 - 18:48 #6
eksempel paa sidste del:

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 fuxi Nybegynder
05. februar 2006 - 18:53 #7
Super! Mange tak!
smid lige et svar så du kan få point :O)
Avatar billede arne_v Ekspert
05. februar 2006 - 19:02 #8
ok
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