Autor Beitrag
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Sa 09.06.12 18:57 
Moin

Ich würde gerne die Möglichkeit bieten, eine Methode, die einem Delegaten in einer Klasse übergeben wurde, ebenfalls in einer Datei zu hinterlegen.

Die Methoden-Info bekomme ich über diese kurze Methode:
ausblenden C#-Quelltext
1:
2:
3:
4:
        public static MethodInfo GetFunctionInfo<T>(Func<T> meth)
        {
            return meth.Method;
        }


Mit dem Rückgabewert die Methode wieder aufzurufen ist ja nicht weiter schwer, aber wie kann ich alle Daten abspeichern?
Hab es mit XML versucht, aber so direkt funktioniert zwar das Speichern, aber das Lesen funktioniert nicht.


Daher die Frage:
Hat jemand eine Idee, wie ich alle nötigen Daten als String erhalten kann?
Ich habe es erst so versucht, dass ich Klasse und Methoden-Name mit Punkt getrennt in einem String ablege und dann stück für Stück alles durch gehe, aber wie bekomme ich das vollständig hin?

Klassen-Name und Methoden-Name zu erhalten ist einfach, aber gibt es eine relativ einfache Möglichkeit für das, was ich vor habe?



Gruß
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: So 10.06.12 11:38 
Hallo,

das Stichwort hierzu lautet Reflection.

mit der Assembly Klasse(vereinfacht gesagt ist das deine dll/exe) holst du dir die Assembly in der sich deine Klasse befindet.
Wenn sie in der gleichen ist in der du sie ausführen willst, dann kannst du sie dir mit Assembly.GetCallingAssembly() holen.

Wenn du nun die Assembly von deinem Programm hast, dann kannst du dir mit Assembly.GetType( "MyClass" ) die Klasse rausholen.

Über Type.GetMethod( "MyMethod" ) bekommst du ein MethodInfo objekt für deine Funktion.

Mit MethodInfo.Invoke kannst du deine Methode jetzt aufrufen.


Am besten liest du dir die MSDN Beschreibungen dieser Klassen/Methoden genauer durch.
Palladin007 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 10.06.12 14:04 
So ungefähr hatte ich das auch versucht. Hab nur leider den Code dazu nicht mehr.

Das Problem ist dann aber, wenn es mehrere Namensräume gibt und in beiden eine Klasse mit dem selben Namen liegt, gibt das Probleme.

Ich möchte den String, der die Methode darstellt, möglichst eindeutig haben, sodass am Ende keine Konflikte auftreten.

Und da scheitert es bei mir ja auch schon beim ausgeben der Zeichenkette, weil ich keine Ahnung habe, wie ich den eindeutigen Namen erhalten kann. Klassen-Name und Methoden-Name hab ich, aber wie bekomme ich alle Namensräume in der richtigen Reihenfolge ausgegeben? Und was passiert, wenn die Klassen verschachtelt sind?


Die msdn-Beschreibung dazu hab ich überflogen, so bin ich auch zu den von dir genannten Methoden gekommen.
Aber genaueres dazu, was ich brauche, hab ich nicht gefunden.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 10.06.12 14:16 
Hallo Palladin700,

bei MethodInfo kannst du über die Eigenschaft DeclaringType an die zugehörige Klasse kommen und mittels FullName erhältst du den vollständigen Namen (inkl. Namensbereich).
Sofern du auch die Assembly benötigst, mußt du dann stattdessen AssemblyQualifiedName verwenden.
Alles weitere dazu in der MSDN ;-)

Für diesen Beitrag haben gedankt: Palladin007
Palladin007 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 10.06.12 14:50 
DAS hab ich noch nicht gewusst^^

Danke, werd es nachher gleich mal ausprobieren und mich dann wieder melden^^