Скопировать список вызовов от одного делегата другому - PullRequest
1 голос
/ 30 ноября 2010

Я использую шаблон построителя выражений для создания объекта. Одна из вещей, которую построитель выражений настраивает на объекте, это обработчики событий. Вот некоторый демонстративный псевдокод:

public class TargetObject
    {
        public event Action SomeEvent;
    }

    public class ObjectBuilder
    {
        private Action handler;

        public TargetObject GetObject()
        {
            TargetObject target = new TargetObject();
            target.SomeEvent += handler;

            return target;
        }

        public ObjectBuilder AddHandler(Action handler)
        {
            this.handler += handler;
            return this;
        }
    }

Я бы хотел написать, а не написать:

this.handler += handler;

Для передачи списка вызовов, инкапсулированного членом «обработчика» в ObjectBuilder, в «SomeEvent» в цели. В противном случае ObjectBuilder не получит сборщик мусора, потому что SomeEvent моего TargetObject будет содержать ссылку на «обработчик» ObjectBuilder.

Возможно ли это?

EDIT: В соответствии с запросом приведен пример кода, который использует эти классы:

class Program
    {
        static void Main(string[] args)
        {
            TargetObject target = new ObjectBuilder()
                .AddHandler(DoSomething)
                .GetObject();
        }

        private static void DoSomething()
        {
        }
    }

1 Ответ

0 голосов
/ 30 ноября 2010

Вы уверены, что ObjectBuilder не GC-ed, потому что экземпляр TargetObject содержит свое поле «обработчик»? делегат является неизменным, обработчик this.handler + = создаст новый экземпляр Action.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...