Ich habe eine Klasse, die eine List<Action<int>>
erstellt und behält sie bis zu einem späteren Zeitpunkt. Diese Klasse kann Delegaten aus dieser Liste hinzufügen und entfernen. Das funktioniert gut, solange die Leute nicht zu extravagant werden. Um die anonyme Funktion zu bekämpfen (die nicht entfernt werden kann), überprüfe ich, ob das Ziel des Delegaten null ist. Wenn es Null ist, werfe ich eine Ausnahme aus. Das Problem tritt auf, wenn ein anonymer Delegat eine Funktion enthält. Dies hat ein Ziel, ist aber genauso nicht zu beseitigen. Der vereinfachte Code unten zeigt meine ProblemeSo identifizieren Sie eine anonyme Funktion
public class MyDelegateContainer
{
List<Action<int>> m_Container = new List<Action<int>>();
public void Add(Action<int> del)
{
if (del.Target == null)
{
throw new Exception("No static handlers");
}
m_Container.Add(del);
}
public bool Remove(Action<int> del)
{
if (m_Container.Contains(del))
{
m_Container.Remove(del);
return true;
}
return false;
}
}
public class MyFakeActionClass
{
public void Test(int temp) { }
}
class Program
{
static void Main(string[] args)
{
bool removed = false;
int counter = 0;
MyDelegateContainer container = new MyDelegateContainer();
MyFakeActionClass fake = new MyFakeActionClass();
//container.Add(p => { }); //Throws, this is what I want to happen
container.Add(fake.Test); //Works, this is the use case
removed = container.Remove(fake.Test); //Works, this is the use case
Debug.Assert(removed);
container.Add(p => { fake.Test(p); counter++; }); //Works but I would like it not to
removed = container.Remove(p => { fake.Test(p); counter++; }); //doesn't work
Debug.Assert(removed);
}
}
ich irgendwie müssen identifizieren
p => { fake.Test(p); counter++; }
ist eine anonyme Funktion, so kann ich aus, wenn jemand es versucht. Danke für jede Hilfe
EDIT: Ich sollte beachten, dass ich eine Action<int>
Variable für die anonyme Funktion verwenden könnte und alles würde funktionieren, aber die Hinzufügen und Entfernen sind nie in dem gleichen Umfang in der Praxis.
Wenn es identifiziert wird, ist es nicht anonym. Sind Sie auf der Suche nach einer Schließung, statt? K –
Ich brauche einen Weg, um zu erkennen, dass es eine anonyme Funktion ist – Steve
@Steve - 28 Fragen ohne Antwort aus 83 ?! O_O Und ich sage nur, dass du einen guten Score hast =) – BeemerGuy