Methode per reflection an delegate übergeben


progo

Grünschnabel
Hallo,

Ich hoffe hier kann mir geholfen werden. Ich würde gern eine Methode, die ich per reflection "in der Hand" habe an ein delegate übergeben. Leider hat man aber nicht die Methode selbst sondern nur den Namen der Methode als String, wenn man über reflection darauf zugreift. Casten etc. hat alles nicht geholfen.

Das Problem ist das der Compiler bei der Übergabe eine Methode ohne die Klammern und keinen String mit dem Namen der Methode erwartet. Also sozusagen nur einen Funktionspointer. Die Frage ist also wie komme ich per reflection an den Pointer ran.

Beispiel zur Verdeutlichung
in der Klasse X ist ein delegate definiert und der Konstruktor bekommt als Argument eine Methode übergeben

Code:
public delegate void Foo();
public X (Foo)
in einer anderen Klasse Y sind Methoden implementiert, die dieser foo() - Signatur genügen:

Code:
public void Bar()
  { // do somthing;
  }
Nun kann man ja bekanntlich diese Methode an das Delegat übergeben z.B. in dem man den Konstruktor mit der Methode aufruft:

Code:
X XObj = new X(Bar);
Der Compiler erkennt, dass es sich bei Bar um ein Methode handelt und übergibt sie.
Ich habe aber nicht die Methode selbst, sondern nur den Namen der Methode per Reflection:

Code:
MethodInfo method = thisType.GetMethod(member.Name);
Alle MethodInfo - Methoden liefern nur Strings der Methodennamen aber keine "wirklichen" Pointer zur Übergabe an ein Delegat wie oben beschrieben.

Gibt es eine Möglichkeit? Ich hoffe ich konnte mein Problem verständlich erklären!
 

Alexander Schuc

crazy-weasel
Hi.

Delegate.CreateDelegate ist dein Freund. ;)

Beispiel:
C#:
class TestProgram
{
	public delegate void Foo();

	public void Bar()
	{
		Console.WriteLine("Baaaar");
	}

	public void Call(Foo f)
	{
		f();
	}

	public void Do()
	{

		MethodInfo mi = GetType().GetMethod("Bar");

		Foo f = Delegate.CreateDelegate(typeof(Foo), this, mi) as Foo;

		Call(f);
	}
}
lg,..
 

progo

Grünschnabel
Genau das war es! Danke. Das habe ich zwar auch schonmal versucht aber ich habe nicht dahinter "as Foo" geschrieben, sondern wollte es wie ein Cast mit Klammern nutzen: "Foo f =(Foo) Delegate.CreateDelegate...."
Danke nochmal!
 

Neue Beiträge