При использовании делегата, есть ли способ получить ответ объекта? - PullRequest
4 голосов
/ 04 октября 2011

Как пример:

Метод WebClient.DownloadStringAsync (Uri)

Нормальный код:

private void wcDownloadStringCompleted( 
    object sender, DownloadStringCompletedEventArgs e)
{ 
    // The result is in e.Result
    string fileContent = (string)e.Result;
}

public void GetFile(string fileUrl)
{
    using (WebClient wc = new WebClient())
    {
        wc.DownloadStringCompleted += 
             new DownloadStringCompletedEventHandler(wcDownloadStringCompleted);
        wc.DownloadStringAsync(new Uri(fileUrl));
    }
}

Но если мы используем анонимный delegate вроде:

public void GetFile(string fileUrl)
{
    using (WebClient wc = new WebClient())
    {
        wc.DownloadStringCompleted += 
            delegate {
                // How do I get the hold of e.Result here?
            };
        wc.DownloadStringAsync(new Uri(fileUrl));
    }
}

Как мне там взять e.Result? 1017 *

Ответы [ 5 ]

3 голосов
/ 04 октября 2011

В других ответах используется лямбда-выражение, но для полноты обратите внимание, что вы также можете указать аргументы делегата:

wc.DownloadStringCompleted += 
    delegate(object sender, DownloadStringCompletedEventArgs e) {
        // Use e.Result here.
    };
3 голосов
/ 04 октября 2011

Вы должны быть в состоянии использовать следующее:

using (WebClient wc = new WebClient())
{
    wc.DownloadStringCompleted += (s, e) =>
        {
            string fileContent = (string)e.Result;
        };
    wc.DownloadStringAsync(new Uri(fileUrl));
}
3 голосов
/ 04 октября 2011

Если вы действительно хотите использовать анонимный делегат вместо лямбды:

wc.DownloadStringCompleted += delegate(object sender, DownloadStringCompletedEventArgs e)
{
    // your code
}
3 голосов
/ 04 октября 2011
wc.DownloadStringCompleted += 
            (s, e) => {
                var result = e.Result;
            };

или если вам нравится синтаксис делегата

wc.DownloadStringCompleted += 
            delegate(object s, DownloadStringCompletedEventArgs e) {
                var result = e.Result;
            };
2 голосов
/ 04 октября 2011

Попробуйте это:

public void GetFile(string fileUrl)
{
    using (WebClient wc = new WebClient())
    {
        wc.DownloadStringCompleted += 
            (s, e) => {
                // Now you have access to `e.Result` here.
            };
        wc.DownloadStringAsync(new Uri(fileUrl));
    }
}
...