Ein Methodenname reicht nicht aus ... Sie benötigen auch einen Klassennamen ... aber unter der Annahme, dass die Methode zur aktuellen Klasse gehört (this
), können Sie Reflection dazu verwenden:
public void ExecuteMethod(string methodName)
{
var methodInfo = this.GetType().GetMethod(methodName);
methodInfo.Invoke(this, new [] {});
}
Sie können das obige Ereignis jedoch nicht zuordnen, weil es nicht der richtige Delegattyp ist. Die meisten Event-Handler benötigen eine sender
und eine EventArgs
. So Ihr Code Arbeit machen Sie ein wenig mehr Leim bräuchten:
Dictionary<string, PictureBox> buttonList = new Dictionary<string,PictureBox>();
string buttonName = "button_file";
buttonList[buttonName].Click += GetHandler(buttonName + "_click");
public Action<object, EventArgs> GetHandler(string handlerName)
{
var methodInfo = this.GetType().GetMethod(handlerName, new Type[] {typeof(object), typeof(EventArgs)});
return new Action<object, EventArgs> (sender, eventArgs) => methodInfo.Invoke(this, new [] {sender, eventArgs});
}
Die Idee dabei ist, dass GetHandler
eine Action
mit der rechten Unterschrift zurückgibt (ein Objekt zu akzeptieren und eine EventArgs, in dieser Reihenfolge), das ist, geschrieben als Action<object, EventArgs>
. Die Methode GetHandler
verwendet Reflektion, um die richtige Methode in der aktuellen Klasse zu finden. Anschließend wird ein Lambda-Ausdruck erstellt, der die Methode über Reflection aufruft und die Argumente als Array weiterleitet.
Das obige ist natürlich nur ein Beispiel ... es wäre wahrscheinlich besser, Ihre Delegierten in einem statischen Wörterbuch zu speichern, das berechnet wird, wenn die Seite zum ersten Mal geladen wird.
Wenn Sie nach Ereignishandhabungsflexibilität suchen, die auf einem Laufzeitparameter basiert, ist ein besserer Ansatz wahrscheinlich, die Command event zu verwenden, die es Ihnen ermöglicht, eine Zeichenfolge an den Handler zu übergeben, der dann einen anderen verwenden kann Aktion abhängig vom Inhalt der Zeichenfolge. Auf diese Weise können Sie die Handler-Referenz fest codieren, aber softcodieren, was sie tut.
Mit Reflexion (https://stackoverflow.com/questions/1121441/addeventhandler-using-reflection) würde Ihre Frage beantworten, aber die meisten wahrscheinlich, dass Sie möchte das nicht tun und stattdessen deinen Code umgestalten, um weniger Handler zu haben ... –