2011-10-04 1 views
4

À titre d'exemple:Lors de l'utilisation d'un délégué, existe-t-il un moyen d'obtenir la réponse de l'objet?

WebClient.DownloadStringAsync Method (Uri)

Code normal:

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)); 
    } 
} 

Mais si nous utilisons un delegate anonyme comme:

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)); 
    } 
} 

Comment puis-je obtenir la prise de e.Result là?

Répondre

3
wc.DownloadStringCompleted += 
      (s, e) => { 
       var result = e.Result; 
      }; 

ou si vous aimez la syntaxe des délégués

wc.DownloadStringCompleted += 
      delegate(object s, DownloadStringCompletedEventArgs e) { 
       var result = e.Result; 
      }; 
3

Si vous voulez vraiment utiliser un délégué anonyme au lieu de lambda:

wc.DownloadStringCompleted += delegate(object sender, DownloadStringCompletedEventArgs e) 
{ 
    // your code 
} 
2

Essayez ceci:

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)); 
    } 
} 
3

Vous devriez être capable d'utiliser le followi ng:

using (WebClient wc = new WebClient()) 
{ 
    wc.DownloadStringCompleted += (s, e) => 
     { 
      string fileContent = (string)e.Result; 
     }; 
    wc.DownloadStringAsync(new Uri(fileUrl)); 
} 
3

Les autres réponses utilisent une expression lambda, mais, pour être complet, notez que vous pouvez également specify les arguments du délégué:

wc.DownloadStringCompleted += 
    delegate(object sender, DownloadStringCompletedEventArgs e) { 
     // Use e.Result here. 
    }; 
Questions connexes