2011-08-18 53 views
4

我有一個Action委託聲明像這樣。問題與行動代表,需要列表<T> []

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][]'. 

回答

4

嘗試使用以下

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

的問題是,的Invoke第二參數取params object[]。這樣做的目的是支持具有可變數量參數的代表。數組的內容被映射到參數。第一個元素轉到第一個參數,第二個元素轉到第二個參數,依此類推。

當你用e.Data調用它時,C#編譯器會看到一個數組。它不是將數組作爲第一個參數傳遞,而是將每個元素作爲參數傳遞。通過轉換成object可以強制編譯器將其解釋爲一個單一的參數

+0

作爲一個側面說明:這將工作,因爲這個Invoke過載需要一個「params」參數。我想這是一個味道的問題 - 直接轉換可能會快一點給它的數組 - 但我不知道編譯器是否不會用數組替換params – Carsten

+0

@Coenoen編譯器可以'不要替換params數組,否則會違反規範。 – JaredPar

+0

以及我的恥辱我不得不承認,我從來沒有真正看過規格:( - 但是,謝謝 – Carsten

1

你必須調用

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

因爲調用希望與所有參數的數組 - see here

+0

這是'params'傳遞的一個有趣的副作用。 –