2014-07-22 49 views
0

Definittion的ProgressChanged將其他參數傳遞給事件Action;

// Summary: 
// Event called whenever the progress of the upload changes. 
public event Action<IUploadProgress> ProgressChanged; 

public void insertFile(String filePath) 
{ 
    //.. some code 
    insertRequest.ProgressChanged += Upload_ProgressChanged; 
} 

public void Upload_ProgressChanged(Google.Apis.Upload.IUploadProgress progress) 
{   
    //.. I need filePath from insertFile() here! 
} 

如何通過額外paramtres到Upload_ProgressChanged

我做了以下內容:

public void insertFile(String filePath) 
{ 
    //.. some code 
    ProgressChangedEventArgs args = new ProgressChangedEventArgs() 
    { 
     path = filePath 
    }; 

    insertRequest.ProgressChanged += Upload_ProgressChanged; 
} 

static void Upload_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 

} 

public class ProgressChangedEventArgs : EventArgs 
{ 
    public string path { get; set; } 
} 

而且我有Can not implicitly convert type 'void' to 'System.Action<Google.Apis.Upload.IUploadProgress>'

+0

我會在這裏遵循事件模式... –

+0

@AdrianoRepetti他已經是... – Servy

+0

我會使用_standard_事件模式:您聲明'ProgressChangedEventArgs'?好,現在讓我們將事件從Action 更改爲'EventHandler '。順便說一句,每次都不要(重新)註冊事件處理程序。基本上barrick在他的回答中說過(IMO它更正確,即使它隱含了一些重構)在'EventArgs'類中添加任何你需要的東西。捕獲一個變量也是可行的(絕對如果你不需要在課堂外暴露該事件,並且你不想在不同的類中分離代碼),但你必須理解它的含義。 –

回答

2

而不是使用一個事件的錯誤,你可以捕捉到變量瓶蓋內

insertRequest.ProgressChanges += progress => { /* Do something with filePath here */ }; 
+0

謝謝,這是有效的,但我不明白爲什麼 – koryakinp

+0

什麼是替代方法?與事件? – koryakinp

+0

@ user3715778這是正確的解決方案,並使用事件來解決。 – Servy

0

首先,定義的EventArgs班 - 這將讓你有任何你喜歡的信息...

public class ProgressChgEventArgs : System.EventArgs 
{ 
    public string Name { get;set; } 
    public int InstanceId { get;set; } 

    public ProgressChgEventArgs(string name, int id) 
    { 
     Name = name; 
     InstanceId = id; 
    } 
} 

接下來,創建消耗這些參數的事件:

public event EventHandler<ProgressChgEventArgs> ProgressChanged; 

然後,讓調用處理程序現在

public void OnProgressChanged(ProgressChgEventArgs e) 
{ 
    var handler = new EventHandler<ProgressChgEventArgs>(); 
    if (handler != null) 
     handler(this, e); 
} 

,在相關點的「論......」方法在您的代碼中(假設進度發生變化!),您調用OnProgressChanged(),傳遞ProgressChgEventArgs的相應實例:

private void Progress(string caller, int callerId) 
{ 
    var arguments = new ProgressChgEventArgs(caller, callerId); 
    OnProgressChanged(arguments); 
} 
+0

對不起,你能解釋更多細節嗎?如果你幫我,我會很高興的 – koryakinp

+0

編輯以顯示此概念的用法 – barrick

+0

處理程序中所需的變量是添加事件處理程序時的當前範圍內的變量,而不是激發事件時的變量,因此這完全是錯誤的思路。 – Servy