Делегат свойства C#?

В моих других методах я мог сделать что-то вроде этого,

    public void Add(T item)
    {
        if (dispatcher.CheckAccess())
        {
            ...
        }
        else
        {
            dispatcher.Invoke(new Action<T>(Add), item);
        }
    }

Но как я вызываю свойство для такой ситуации?

    public T this[int index]
    {
        get
        {
            ...
        }
        set
        {
            if (dispatcher.CheckAccess())
            {
                ...
            }
            else
            {
                dispatcher.Invoke(???, value, index); // <-- problem is here
            }
        }
    }
6
задан mpen 9 May 2010 в 08:25
поделиться

1 ответ

Изменить: Следующий абзац больше не применяется, так как вопрос OP с тех пор был отредактирован .

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


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

dispatcher.Invoke(
    new Action<T>(  delegate (T item) { this[index] = item; }  ),
    item );

или (с использованием лямбда-функции, доступной с версии языка C # 3):

dispatcher.Invoke(
    new Action<T>(  (T item) => { this[index] = item; }  ),
    item );

Примечание: Вы создаете анонимный делегат или лямбда-функцию, которая принимает один аргумент ( поз. ). Другой обязательный аргумент ( index ) берется из «внешнего» контекста. (На ум приходит термин закрытие .) Я считаю, что это единственный способ избежать замены диспетчера на тип делегата, который иногда вызывается с двумя аргументами вместо один.

Если это не проблема, код Invoke может измениться, например, на:

dispatcher.Invoke(
    new Action<int,T>(  (int index, T item) => { this[index] = item; }  ),
    index, item );
7
ответ дан 17 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

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