Правильный способ форматирования события Delegate в AddListener [duplicate]

Эта библиотека синтаксического анализа веса должна решить все подобные проблемы. Мне нравится библиотека, потому что ее довольно легко расширить.

Пример синтаксического анализа:

var caseOne = Date.parseDate("Jul 8, 2005", "M d, Y");
var caseTwo = Date.parseDate("2005-07-08", "Y-m-d");

И форматирование обратно в строку (вы заметите, что оба случая дают точно такой же результат):

console.log( caseOne.dateFormat("M d, Y") );
console.log( caseTwo.dateFormat("M d, Y") );
console.log( caseOne.dateFormat("Y-m-d") );
console.log( caseTwo.dateFormat("Y-m-d") );

21
задан Ryan Gates 20 February 2013 в 18:59
поделиться

4 ответа

Кажется, что если вы явно реализуете EventHandler, вы не можете ссылаться на «Свойство» при запуске события. Вы должны обратиться в хранилище.

7
ответ дан Andrew Barber 19 August 2018 в 06:15
поделиться

Какая ошибка? Я думаю, его ошибка переполнения стека, потому что вы вызываете add и remove на yourserlf (одно и то же событие). Также вы не можете поднять событие ACCESSOR.

Допустимый способ сделать это - создать резервное закрытое событие, которое будет добавлено и удалено из открытого доступа, и вы должны поднять это личное событие.

Данг, немного позднее.

1
ответ дан Euphoric 19 August 2018 в 06:15
поделиться
  • 1
    Нет, он не знает о переполнении стека, потому что его код даже не компилируется. – Gabe 21 December 2010 в 07:47
  • 2
    Да, я перестал думать об этом, когда ответ Марка был отправлен. Вы правы. – Euphoric 21 December 2010 в 07:50

При явном событии вам необходимо предоставить свой собственный резервный магазин - поле делегата или что-то вроде EventHandlerList. Текущий код рекурсивный. Попробуйте:

private EventHandler itemsProcessed;
public event EventHandler ItemsProcessed
{
    add
    {
        itemsProcessed-= value;
        itemsProcessed+= value;
    }

    remove
    {
        itemsProcessed-= value;
    }
}

Затем (и отмечая, что я little осторожно относится к «о том, чтобы повернуть null» резьбу по краю]:

var snapshot = itemsProcessed;
if(snapshot != null) snapshot(this, EventArgs.Empty);

С более поздними версиями C # это можно упростить:

itemsProcessed?.Invoke(this, EventArgs.Empty);
21
ответ дан Marc Gravell 19 August 2018 в 06:15
поделиться
  • 1
    Один недостаток: доступен только в классе – Abdul Munim 5 January 2011 в 09:14
  • 2
    Почему вы хотите получить доступ к закрытому событию вне класса? – Joshua Ramirez 16 March 2012 в 17:57
  • 3
    Подкласс, дух. Сделайте материал защищенным. – Nyerguds 2 August 2017 в 09:15
  • 4
    Подкласс @Nyerguds редко имеет аргумент good для доступа к полям поддержки; в случае событий более общий подход - это protected virtual void OnItemsProcessed() => itemsProcessed?.Invoke(this, EventArgs.Empty); - выполненная работа, и нет необходимости раскрывать доступ к полю – Marc Gravell♦ 2 August 2017 в 10:01
  • 5
    Ну, я пытаюсь создать пользовательский OnMouseWheel, который, возможно, выполняет исходное связанное событие Control.MouseWheel ... и я не могу без отключения прокрутки. Действительно расстраивает. Прокрутка мыши - одна из тех странных полуавтоматических вещей. – Nyerguds 3 August 2017 в 16:51

Я не могу сказать из вашего поста, если вы пытаетесь поднять событие из производного класса или нет, но я обнаружил, что вы не можете определить событие в базовом классе, а затем поднять его (непосредственно) в производном классе, по какой-то причине это пока не совсем ясно.

Итак, я определяю защищенные функции в базовых классах для повышения событий (которые определены в этих базовых классах), например:

// The signature for a handler of the ProgressStarted event.
// title: The title/label for a progress dialog/bar.
// total: The max progress value.
public delegate void ProgressStartedType(string title, int total);

// Raised when progress on a potentially long running process is started.
public event ProgressStartedType ProgressStarted;

// Used from derived classes to raise ProgressStarted.
protected void RaiseProgressStarted(string title, int total) {
    if (ProgressStarted != null) ProgressStarted(title, total);
}

Затем в производном классе я вызываю RaiseProgressStarted (название, итого) вместо вызова ProgressStarted (название, итого).

Похоже, это длинный путь. Возможно, кто-то еще знает, как лучше справиться с этой проблемой.

5
ответ дан Shavais 19 August 2018 в 06:15
поделиться
  • 1
    Я просто понял, что это 5-летний пост. Я столкнулся с проблемой и выяснил, что происходит для меня, поэтому я опубликовал этот ответ. Может быть, это кому-то поможет. – Shavais 27 July 2015 в 19:20
  • 2
    Хе-хе, у меня снова была эта проблема, я не мог вспомнить, что вызвало ее и как я ее исправил, и нашел свой собственный ответ 11 месяцев назад. Это довольно забавно. – Shavais 30 June 2016 в 21:39
Другие вопросы по тегам:

Похожие вопросы: