05. februar 2006 - 16:13Der 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); } }
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.
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)
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.