采用List <t> [] </t>的Action委托的问题

时间:2011-08-18 21:25:11

标签: c# arrays list delegates action

我有一个像这样声明的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; }
}

_psdAction指向此功能。我从来没有达到这个代码。

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 个答案:

答案 0 :(得分:4)

尝试以下

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

问题是Invoke的第二个参数需要params object[]。这样做的目的是支持具有可变数量参数的代理。数组的内容映射到参数。第一个元素转到第一个参数,第二个元素转到第二个参数,依此类推。

当您使用e.Data调用它时,C#编译器会看到一个数组。它不是将数组作为第一个参数传递,而是尝试将每个元素作为参数传递。通过强制转换为object,您可以强制编译器将其解释为单个参数

答案 1 :(得分:1)

你必须致电

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

因为Invoke想要一个包含所有参数的数组 - see here