using System;
namespace EinEinfacherDelegateBool_v001
{
class Program
{
class Caller
{
public delegate bool OnAction();
// public delegate bool RefOnAction(ref TypeOneWorker typeOneWorker);
public OnAction DoAction;
// public RefOnAction refDoAction;
public bool CallDoAction()
{
if (this.DoAction != null)
{
return this.DoAction();
}
return false;
}
//public bool refCallDoAction()
//{
// if (this.refDoAction != null)
// {
// return this.refCallDoAction();
// }
// return false;
//}
}
class TypeOneWorker
{
static int id = 0;
int autoid = -1;
public bool Action()
{
id++;
autoid = id;
Console.WriteLine("TypeOneWorker {0}.", autoid);
//Console.ReadKey();
return true;
}
}
class TypeTwoWorker
{
public bool Action()
{
Console.WriteLine("TypeTwoWorker.");
//Console.ReadKey();
return false;
}
}
static void Main(string[] args)
{
Caller c = new Caller();
TypeOneWorker typeOneWorker = new TypeOneWorker();
c.DoAction = new Caller.OnAction(typeOneWorker.Action);
c.DoAction += new Caller.OnAction(new TypeTwoWorker().Action);
c.DoAction += new Caller.OnAction(typeOneWorker.Action);
c.DoAction += new Caller.OnAction(new TypeTwoWorker().Action);
//
// ... more 'n more
//
// c.DoAction = new Caller.OnAction(typeOneWorker.Action);
// c.DoAction += new Caller.OnAction(new TypeTwoWorker().Action);
//
// c.DoAction -= BaWorker.Action;
//
c.CallDoAction();
object x = c.DoAction.GetInvocationList();
Console.Write("\n");
Console.Write("End M(ain).");
Console.ReadKey();
}
}
}
Das Ganze ist Teil einer Mess-Steuer-Softare (Sensor / Ventil) die als multithreading umgesetzt weden soll.
Wie bekomme ich nun bei einer beliebig langen Liste an Methoden-Aufrufen von Caller.DoAction eine bestimmte Methode wieder entfernt, wenn ich nicht weiss an welcher Stelle in der Liste / welches "Element" in der Liste diese Methode ist?
Ich kann mir zwar per < c.DoAction.GetInvocationList() > die Liste abrufen. Ich kann auch per < c.DoAction -= typeOneWorker.Action > wieder eine Methode entfernen. Der delegate arbeitet dabei aber wie ein Stack - und entfernt das letzte, passende, Element in der Liste. Ich wuerd nun aber gern ein bestimmtes Element / eine bestimmte Methode entfernen, ohne zu wissen an welcher Stelle.
Frage
MaceFan
'nabend die Gemeinde.
using System; namespace EinEinfacherDelegateBool_v001 { class Program { class Caller { public delegate bool OnAction(); // public delegate bool RefOnAction(ref TypeOneWorker typeOneWorker); public OnAction DoAction; // public RefOnAction refDoAction; public bool CallDoAction() { if (this.DoAction != null) { return this.DoAction(); } return false; } //public bool refCallDoAction() //{ // if (this.refDoAction != null) // { // return this.refCallDoAction(); // } // return false; //} } class TypeOneWorker { static int id = 0; int autoid = -1; public bool Action() { id++; autoid = id; Console.WriteLine("TypeOneWorker {0}.", autoid); //Console.ReadKey(); return true; } } class TypeTwoWorker { public bool Action() { Console.WriteLine("TypeTwoWorker."); //Console.ReadKey(); return false; } } static void Main(string[] args) { Caller c = new Caller(); TypeOneWorker typeOneWorker = new TypeOneWorker(); c.DoAction = new Caller.OnAction(typeOneWorker.Action); c.DoAction += new Caller.OnAction(new TypeTwoWorker().Action); c.DoAction += new Caller.OnAction(typeOneWorker.Action); c.DoAction += new Caller.OnAction(new TypeTwoWorker().Action); // // ... more 'n more // // c.DoAction = new Caller.OnAction(typeOneWorker.Action); // c.DoAction += new Caller.OnAction(new TypeTwoWorker().Action); // // c.DoAction -= BaWorker.Action; // c.CallDoAction(); object x = c.DoAction.GetInvocationList(); Console.Write("\n"); Console.Write("End M(ain)."); Console.ReadKey(); } } }
Das Ganze ist Teil einer Mess-Steuer-Softare (Sensor / Ventil) die als multithreading umgesetzt weden soll.
Wie bekomme ich nun bei einer beliebig langen Liste an Methoden-Aufrufen von Caller.DoAction eine bestimmte Methode wieder entfernt, wenn ich nicht weiss an welcher Stelle in der Liste / welches "Element" in der Liste diese Methode ist?
Ich kann mir zwar per < c.DoAction.GetInvocationList() > die Liste abrufen. Ich kann auch per < c.DoAction -= typeOneWorker.Action > wieder eine Methode entfernen. Der delegate arbeitet dabei aber wie ein Stack - und entfernt das letzte, passende, Element in der Liste. Ich wuerd nun aber gern ein bestimmtes Element / eine bestimmte Methode entfernen, ohne zu wissen an welcher Stelle.
Hm... wer weiss Rat?
huebschen Abend wuensch ich,
mf
Bearbeitet von MaceFan6 Antworten auf diese Frage
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.