У меня есть класс, который создает List<Action<int>>
и удерживает их до более позднего времени. Этот класс может добавлять и удалять делегатов из этого списка. Это работает хорошо, пока люди не слишком увлекаются. Для борьбы с анонимной функцией (которую нельзя удалить) я проверяю, чтобы цель делегата была нулевой. Если его ноль, я бросаю исключение. Проблема возникает, когда есть анонимный делегат, который содержит функцию. Это имеет цель, но так же неустранимо. Упрощенный код ниже иллюстрирует мои проблемы
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);
}
}
Мне нужен какой-то способ идентифицировать
p => { fake.Test(p); counter++; }
- анонимная функция, поэтому я могу выдать ее, если кто-то попробует. Спасибо за любую помощь
РЕДАКТИРОВАТЬ: я должен отметить, что я мог бы использовать переменную Action<int>
для анонимной функции, и все бы работало, но на практике Add и Remove никогда не бывают в одной области.