Avatar billede fuxi Nybegynder
11. november 2005 - 08:30 Der er 12 kommentarer og
1 løsning

Kald af klasse og metode dynamisk

Lad os antage at jeg har følgende klasse:
    public class TestClass
    {
        public TestClass()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        public string getText()
        {
            return "Det virker da bare :o) ";
        }
           
        public string getMyText(string myText)
        {
            return myText;
        }
    }

Jeg vil meget gerne kunne kalde denne (eller en anden klasse) dynamisk ud fra en string eller et databasekald

Det vil sige at jeg gerne vil kunne gøre følgende (kan naturligvis ikke lade sige gøre som det står):

string minKlasse = "TestClass";
Object mitObjekt = minKlasse;
string mitResultat = minKlasse.dynamiskMetodeKalde("getText");

Alt ovenstående er naturligvis seudo kode.
Ud over det vil jeg også meget gerne have det så jeg kan kalde metoden med dynamiske parameter.

Er der nogen mulighed for at man kan gøre det, og i så fald hvordan?
Avatar billede dr_chaos Nybegynder
11. november 2005 - 08:32 #1
du kan bruge:
TestClass tc = new TestClass();
string s = tc.getText();
Avatar billede arne_v Ekspert
11. november 2005 - 08:35 #2
ja

det hedder "reflection"

eksempel:

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 arne_v Ekspert
11. november 2005 - 08:36 #3
du bygger:

DinAssembly.cs -> DinAssembly.dll

og

Test.cs -> Test.exe
Avatar billede dr_chaos Nybegynder
11. november 2005 - 08:37 #4
hmm der lærte jeg noget nyt :)
Avatar billede fuxi Nybegynder
11. november 2005 - 09:12 #5
DinAssembly hvad er det?
Er det mit namespace eller hvad pokker er det?
Avatar billede fuxi Nybegynder
11. november 2005 - 09:13 #6
Doe! Jeg fik ikke lige læst dit sidste svar arne_v du har jo allerede nævnt DinAssembly
Avatar billede fuxi Nybegynder
11. november 2005 - 09:27 #7
Hmm jeg har problemer med at få det til at virke. Jeg har lavet følgende:
- Jeg har oprettet et nyt projekt + solution i Visual Studio som hedder WebApplication1
- Der er oprettet en fil der hedder TestClass.cs (Min klasse)
- Der er oprettet en WebForm der hedder WebForm1.aspx

Mine filer ser ud som følgende:

** TestClass.cs **
using System;

namespace WebApplication1
{
    /// <summary>
    /// Summary description for TestClass.
    /// </summary>
    public class TestClass
    {
        public TestClass()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        public string getText()
        {
            return "Det virker da bare :o) ";
        }
           
        public string getMyText(string myText)
        {
            return myText;
        }
    }
}

** WebForm1.aspx.cs **
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Reflection;

namespace WebApplication1
{
    /// <summary>
    /// Summary description for WebForm1.
    /// </summary>
    public class WebForm1 : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Label Label1;

        private void Page_Load(object sender, System.EventArgs e)
        {
            Object o = Assembly.Load("WebApplication1").CreateInstance("TestClass");
            string myString = "";
            myString = (string) o.GetType().InvokeMember("getText", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, o, null);
            Label1.Text = "Hello World";
        }

        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: This call is required by the ASP.NET Web Form Designer.
            //
            InitializeComponent();
            base.OnInit(e);
        }
       
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion
    }
}
Avatar billede fuxi Nybegynder
11. november 2005 - 09:28 #8
Den fejl der opstår er følgende:
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:


Line 24:             Object o = Assembly.Load("WebApplication1").CreateInstance("TestClass");
Line 25:             string myString = "";
Line 26:             myString = (string) o.GetType().InvokeMember("getText", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, o, null);
Line 27:             Label1.Text = "Hello World";
Line 28:         }


Source File: c:\inetpub\wwwroot\webapplication1\webform1.aspx.cs    Line: 26
Avatar billede arne_v Ekspert
11. november 2005 - 09:31 #9
ligger der en WebApplication1.dll ?
Avatar billede fuxi Nybegynder
11. november 2005 - 09:39 #10
Yeps!
Avatar billede arne_v Ekspert
11. november 2005 - 10:43 #11
hov

.CreateInstance("WebApplication1.TestClass");
Avatar billede fuxi Nybegynder
11. november 2005 - 10:55 #12
Super ... det var kanon nu kan jeg komme videre med mit lille system..

Arne_v smider du lige et svar så du kan få dine point :O)
Avatar billede arne_v Ekspert
11. november 2005 - 11:51 #13
kommer her
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