Проблема с делегатом Action, который принимает List <T>[] - PullRequest
4 голосов
/ 19 августа 2011

У меня есть делегат Action, объявленный так.

private readonly Action<List<PSDPoint>[]> _psdAction;
_psdAction = AddPSDData;

PSDPoint - очень простой класс.

public class PSDPoint
{
    public int Frequency { get; set; }
    public double Power { get; set; }
}

Я пытаюсь вызвать делегат вот так.

private void PSDData(object sender, PSDEventArgs e)
{
    Dispatcher.Invoke(_psdAction, e.Data);
}

PSDEventArgs выглядит следующим образом.Вы можете видеть e.Data того же типа данных.

public class PSDEventArgs
{
    public List<PSDPoint>[] Data { get; set; }
    public string[] Channels { get; set; }
}

_psdДействие указывает на эту функцию.Я никогда не получаю этот код.

private void AddPSDData(List<PSDPoint>[] data)
{
    ...
}

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

Object of type 'System.Collections.Generic.List`1[DataLogger.Model.PSDPoint]' cannot be converted to type 'System.Collections.Generic.List`1[DataLogger.Model.PSDPoint][]'.

Ответы [ 2 ]

4 голосов
/ 19 августа 2011

Попробуйте следующее

Dispatcher.Invoke(_psdAction, (object)e.Data);

Проблема в том, что второй параметр Invoke принимает params object[].Целью этого является поддержка делегатов с переменным числом аргументов.Содержимое массива сопоставляется с параметрами.Первый элемент идет к первому параметру, второй элемент ко второму параметру и так далее.

Когда вы вызываете его с помощью e.Data, компилятор C # видит массив.Вместо того, чтобы передавать массив в качестве первого аргумента, он пытается передать каждый элемент в качестве параметра.Приведя к object, вы можете заставить компилятор интерпретировать его как один параметр

1 голос
/ 19 августа 2011

вам нужно позвонить

Dispatcher.Invoke (_psdAction, new object[]{e.Data});

Поскольку Invoke хочет массив со всеми параметрами - см. Здесь

...