Methodenaufruf



  • hi,
    ich speichere alle Methoden des Objektes m in den Array n,
    soweit funktioniert es auch. Nur jetzt wollte ich diese auch aufrufen, leider weiß ich nicht wie. Kann mir einer einen Tipp geben?

    public static void ListMethods(Medium m) {
                Console.WriteLine("***** Methoden *****");
                Type t = m.GetType();
                MemberInfo[] n = t.GetMethods();
                //Methodenaufruf .....
    	  }
    

    Mit ein asynchronen Aufruf über ein Delegate habe ich es auch schon probiert, nur das Problem ist wieder das selbe, mit der Methodenübergabe. Ich weiß nicht wie ich den Compiler sagen soll, das er es als Methode behandeln soll. Der Compiler (MS Visual Studio 2008) die Fehlermeldung:

    "System.Reflection.MemberInfo.Name" ist ein(e) "Eigenschaft", wird aber wie ein(e) "Methode" verwendet.

    class Bibliothek {
            public static void Biblio_Callback(IAsyncResult ar) {
                Console.Write("returns '{0}'", del.EndInvoke(ar));
            } 
            private delegate string Biblio_del();
            private static Biblio_del del;
    
            public static void ListMethods(Medium m) {// m ist ein Objekt der Klasse Medium
                Console.WriteLine("***** Methoden *****");
                Type t = m.GetType();
                MemberInfo[] n = t.GetMethods(); 
                // Das Array MethodInfo durchlaufen und Namen ausgeben.
                for (int i = 0; i < n.Length; i++) {
                 Console.WriteLine("{0}", n[i].ToString());
    
                 del = new Biblio_del(n[i].Name); // hier wird der Fehler erzeugt, 
                 AsyncCallback callback = new AsyncCallback(Biblio_Callback);
                 del.BeginInvoke(callback, null);
    
                }
    }
    

    Da ich auf den Gebiet der Reflection und Delegate noch ein Neuling bin, hoffe ich das mir einer die Frage beantworten kann. In Forum bzw. über die MSDN-Hilfe habe ich leider nichts gefunden, was mir dem entsprechend weiter hilft.

    Vielen Dank

    fluffy17



  • Bin auch nich so integiret in .NET aber ich denke dein delegate passt mich zu deiner callbarck funktion.

    Das delegate muss ja den gleichen funktionparamter wie deine callback func. haben

    statt:

    private delegate string Biblio_del();
    

    so

    private delegate void Biblio_del(IAsyncResult ar);
    

    und die funktion rufst du dann auf statt:

    del = new Biblio_del(n[i].Name);
    

    so

    del(n[i].Name);
    


  • ich habe es so probiert, leider hat es nicht ganz geholfen.

    public static void Biblio_Callback(IAsyncResult ar) {
                Console.Write("returns '{0}'", ar.AsyncState);
    }
    
    private delegate void Biblio_del(IAsyncResult ar);
    private static Biblio_del del;
    
    public static void ListMethods(Medium m) {
                Type t = m.GetType();
                MemberInfo[] n = t.GetMethods();
    
                AsyncCallback callback = new AsyncCallback(Biblio_Callback);
                del.BeginInvoke((IAsyncResult)n[2], callback, null);
                // Fehler: System.InvalidCastException wird ausgelöst!
    

    Ohne Typcast, geht es überhaupt nicht.

    statt:

    ...

    so

    C/C++ Code:
    private delegate void Biblio_del(IAsyncResult ar);

    Dann würde ich doch auch nicht mehr an den Rückgabetypen ran kommen oder sehe ich das falsch?

    Vielen Dank trotzdem an BorisDieKlinge@off und auch hoffentlich an die nächsten post'er.

    fluffy17



  • ich nehme an der typ de rParameters

    n[i].Name
    

    ist

    IAsyncResult
    

    ????

    du muss sowas machen

    statt:

    AsyncCallback callback = new AsyncCallback(Biblio_Callback)
    

    sowas:

    del+= new Biblio_del(Biblio_Callback); //hier gibts du dem delegate die methote an welche aufgerufen werden soll.
    
    del(n[i].Name); //Delegete aufrufen
    


  • BorisDieKlinge schrieb:

    n[i].Name

    ist leider von Typ String und kann selbst mit ein Typecast nicht in ein IAsyncResult Objekt konvertiert werden.

    Daher wenn ich es so schreibe:

    public static void Biblio_Callback(IAsyncResult ar) {
                Console.Write("returns '{0}'", ar.AsyncState);//del.EndInvoke(ar));
            }
            private delegate void Biblio_del(IAsyncResult ar);
            private static Biblio_del del;
    
            public static void ListMethods(Medium m) {
                Type t = m.GetType();
                MemberInfo[] n = t.GetMethods(); 
    
                    del += new Biblio_del(Biblio_Callback);
                    del(n[1].Name); // <--- Fehler
            }
    

    Meldet der Compiler " Fehler CS1594: Der Delegat "A11.Bibliothek.Biblio_del" enthält einige ungültige Argumente" und "Fehler CS1503: 1-Argument: kann nicht von "string" in "System.IAsyncResult" konvertiert werden."
    Der Array n enthält auch keine Eigenschaften die von Typ IAsyncResult sind 😕



  • Hi,

    Hier ist die MSDN Doku zu Type.GetMethods():
    http://msdn.microsoft.com/de-de/library/td205ybf.aspx

    Da wirst Du sehen, dass der Rückgabetyp nicht MemberInfo[], sondern MethodInfo[] ist.
    Hier ist die MSDN Doku zu MethodInfo:
    http://msdn.microsoft.com/de-de/library/system.reflection.methodinfo.aspx

    Medium m = new Medium();
    Type t = m.GetType();
    MethodInfo[] n = t.GetMethods();
    foreach(MethodInfo mi in n)
    {
       // Hier Aufruf der Methoden, gemäss deren Signaturen (Parameter):
       // mi.Invoke(...)
    }
    

    Delegaten brauchst Du nicht.

    Simon



  • 😃 super so funktioniert es total prima 😃
    großes thx an euch beide!


Anmelden zum Antworten