Avatar billede rwj_defcon1 Nybegynder
08. oktober 2005 - 20:14 Der er 10 kommentarer og
1 løsning

Kald af klasser via deres navne som strenge

Problemstillingen er lidt mærkelig og måske er det bare mig der er dum, men here goes.

Jeg har en klasse som kalder nogle "modul"-klasse med 13 standard statiske metoder. Alle moduler har de 13 metoder som skal kaldes. Eneste der adskiller klasser fra hinanden er deres namespace.

Eksempel (2 moduler = 2 namespaces)

namespace1.klassenavn.metode1();
namespace2.klassenavn.metode1();
namespace1.klassenavn.metode2();
namespace2.klassenavn.metode2();
...
namespace1.klassenavn.metode13();
namespace2.klassenavn.metode13();

Dette virker altsammen fint, men hver gang jeg tilføjer et modul skal jeg tilføje de 13 metodekald...
Der tænkte jeg at hvis jeg kunne en collection af namespace-navnene (array, xml, eller noget i den stil). og på en eller anden måde kunne jeg nøjes med at tilføje namespace navnet.

Med psuedo-kode ville det være noget i denne stil

foreach(string namespace in collection) {
  (namespace).klassenavn.metode1();
  (namespace).klassenavn.metode2();
  ...
  (namespace).klassenavn.metode13();
}

Altså det jeg er ude efter er at kunne på en eller anden måde konverteret namespacet som streng til det egentlige namespace.

Er noget i denne stil overhovedet muligt ?!?
Avatar billede arne_v Ekspert
08. oktober 2005 - 20:36 #1
du kan loade klasser dynamisk via reflection og kalde metoder på dem

så ja det kan du godt
Avatar billede arne_v Ekspert
08. oktober 2005 - 20:38 #2
Assembly.Load("DinAssembly").CreateInstance("DinKlasse");

laver et objekt udfra 2 string's
Avatar billede arne_v Ekspert
08. oktober 2005 - 20:46 #3
Eksempel:

using System;
using System.Reflection;

namespace TestOne
{
    public class Test
    {
        public static void Check()
        {
            Console.WriteLine("TestOne");
        }
    }
}

namespace TestTwo
{
    public class Test
    {
        public static void Check()
        {
            Console.WriteLine("TestTwo");
        }
    }
}

namespace E
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            string[] ns = { "TestOne", "TestTwo" };
            foreach(string ns1 in ns)
            {
                Type c = Assembly.GetExecutingAssembly().GetType(ns1 + ".Test", false, false);
                c.InvokeMember("Check", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod, null, null, null);
            }
        }
    }
}
Avatar billede arne_v Ekspert
08. oktober 2005 - 20:47 #4
jeg bruger GetExecutingAssembly() fremfor Load("assemblynavn") fordi de i dette tilfælde
er i samme assembly
Avatar billede rwj_defcon1 Nybegynder
08. oktober 2005 - 22:05 #5
Det virker kanont :-) ... Troede egentlig ikke det ville kunne lade sig gøre...

Lige et spørgsmål... Når der sendes parametre med kan skal man ikke angive ref, out osv?... mærkeligt at den selv kan finde ud af det

Smid også et svar...
Avatar billede arne_v Ekspert
08. oktober 2005 - 22:15 #6
man kan sende argumenter med - jeg har aldrig prøvet det med ref - jeg bruger aldrig ref

og svar
Avatar billede rwj_defcon1 Nybegynder
08. oktober 2005 - 23:10 #7
ref parametere er ellers mega smarte i nogle tilfælde...

Men tak for svar... Det har gjort min kode meget nemmere at arbejde med... Og sat en masse andre ideer igang til hvad det ellers kan bruges til af smarte ting...
Avatar billede prec Nybegynder
12. oktober 2005 - 13:07 #8
Når en class overføres som parameter til en funktion vil den altid overføres som en reference til addressen i hukommelsen og vil dermed blive ændret direkte.

En struct kan overføres som parameter og frit ændres uden indflydelse på hvad der foregår andre steder. Hvis det ønskes overføres den med ref. Dette gælder f.eks for string, int osv.

Personligt har jeg aldrig haft brug for at bruge en ref.
Avatar billede arne_v Ekspert
12. oktober 2005 - 13:16 #9
String er en class ikke en struct

man kan overføre både struct og class med ref, hvis man måtte ønske det

jeg er helt enig i at ref er ikke noget man bruger hvis man kan undgå det
Avatar billede rwj_defcon1 Nybegynder
12. oktober 2005 - 19:16 #10
Jeg bruger ofte ref sammen med booleans... De bliver jo ikke sendt som standard med ref... out parametre er også ganske effektive når der skal mere en returværdien (i stedet for at lave et returobjekt)
Avatar billede arne_v Ekspert
12. oktober 2005 - 19:45 #11
der er ikke noget som standard bliver sendt som ref

iøvrigt har C# en glimrende syntax for ref kald (at det skal angives
i selve kaldet også)

i C++ kan man blive groft vildledt fordi "uskyldige" kald ændrer på
variable
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