Laden...

[erledigt] Array von Funktionspointern innerhalb einer Klasse

Erstellt von Gredhard vor 10 Jahren Letzter Beitrag vor 10 Jahren 657 Views
G
Gredhard Themenstarter:in
2 Beiträge seit 2013
vor 10 Jahren
[erledigt] Array von Funktionspointern innerhalb einer Klasse

Guten Abend,

ich stehe vor folgendem Problem:

Ich möchte, wenn ein bestimmter Text eingegeben wird, eine dazugehörige Funktion aufrufen.
Dazu habe ich mir ein Array mit den regulären Ausdrücken erstellt (z.B. ("/testbefehl (.*)")) sowie ein Array des Typen System.Threading.ParameterizedThreadStart mit den zugehörigen Funktionspointern.

Das Problem, welches auftritt, ist die Meldung, dass die Funktionen statisch sein müssten:> Fehlermeldung:

Ein Feldinitialisierer kann nicht auf das nicht statische Feld bzw. die nicht statische Methode oder Eigenschaft "LeeresCS.Form1.funcTest(object)" verweisen

Code dazu etwa so (nach dem Muster short but complete):

using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace LeeresCS
{
    public partial class Form1 : Form
    {
        private string randomText = "Beispielsvariable, die in Funktionen benutzt werden soll.";
        private string[] cmds = new string[] { "/test (.*)" };
        private System.Threading.ParameterizedThreadStart[] cmd_funcs = { funcTest };

        private void funcTest(object data)
        {
            Match myMatch = (Match)data;
            MessageBox.Show(randomText+" und "+myMatch.Groups[1].Value);
            testTimer.Enabled = false;
        }
    }
}

Alles klar. Mein nächster Gedanke war es dann, die Funktion statisch zu machen.
Dabei stellte sich das Problem heraus, dass ich die Variable randomText nicht mehr lesen sowie auf den Timer testTimer nicht mehr zugreifen konnte.
Das Problem mit der Variable könnte ich umgehen, indem ich sie ebenfalls statisch mache.
Nur würde dabei der Zugriff auf den Timer weiterhin fehlen.

Mein Ziel ist es, flexibel die Funktionen aus dem Array aufrufen zu können (gerne auch, ohne in jeder Funktion nochmal das Argument casten zu müssen), und dennoch in ihnen selbst Zugriff auf die Variablen der Klasse sowie die Form-Elemente zu besitzen.

Könnt ihr, die myCSharp-Community, mir bei meinem Problem helfen und habt einen Ansatz, an dem ich weiterarbeiten kann?
Ich bin seit gestern dabei, von VB.NET auf C# umzusteigen (da mir die Syntax eher zusagt, unter Anderem auch aufgrund der anderen Sprachen, die ich beherrsche) und an dieser Stelle hapert es leider noch ein wenig.

Viele Grüße

2.760 Beiträge seit 2006
vor 10 Jahren

Servus,

damit Du typisierte Parameter übergeben kanns musst du einen eigenen Delegaten erstellen (oder einen der bereits enthaltenen Func und Action verwenden):


	public delegate void CmdDelegate (string param);

Der enthät die Methodensignatur hier void als return value und einen string Parameter.

	class Test
	{

		List<KeyValuePair<string,CmdDelegate>> cmds = new List<KeyValuePair<string,CmdDelegate>>();

		public Test ()
		{
			cmds.Add(new KeyValuePair<string, CmdDelegate>("test1",Cmd1Handler));
			cmds.Add(new KeyValuePair<string, CmdDelegate>("test2",Cmd2Handler));
		}

		public void Handle (string cmd, string param)
		{
			foreach (var item in cmds) {
				if (item.Key != cmd)
					continue;


				CmdDelegate cmdDelegate = item.Value;

				cmdDelegate(param);
			}
		}

		private string _irgendwas = "_irgendwas";


		private void Cmd1Handler (string param)
		{
			Console.WriteLine("test1" + param + _irgendwas);
		}
		private void Cmd2Handler (string param)
		{
			Console.WriteLine("test2" + param +_irgendwas);
		}
	}

	public delegate void CmdDelegate (string param); // <-- Delegate

	class Program
	{

		static void Main (string[] args)
		{
			Test test = new Test();
			test.Handle("test1", "blubb");
			test.Handle("test2", "BLUBB");
		}
	}

G
Gredhard Themenstarter:in
2 Beiträge seit 2013
vor 10 Jahren

Funktioniert perfekt!

Vielen Dank, jaensen, für die schnelle (besonders um diese Uhrzeit) Antwort, ich wünsche dir und allen Lesern noch eine angenehme Nacht.

Grüße