I did not know that it is possible to have a delegate as a call to a method, then have that method actually execute that delegate at it’s convenience. I’m busy converting a Xamarin conference application for the IPad and am wrangling getting it to show Silicon Valley Code Camp data rather than MWC (Mobile World Conference data).
So, here is the method I ran into:
var siteParser = new MWC.SAL.MWCSiteParser(); siteParser.GetConference (Constants.ConferenceDataUrl, () => { var c = siteParser.ConferenceData;<span class="kwrd">if</span> (c == <span class="kwrd">null</span>) { WriteLine(<span class="str">"xxx No conference data downloaded, skipping"</span>); } <span class="kwrd">else</span> { <span class="kwrd">if</span> (SaveToDatabase(c)) { ea.Success = <span class="kwrd">true</span>; } } UpdateFinished(<span class="kwrd">null</span>, ea); isUpdating = <span class="kwrd">false</span>; } );</pre>
And the method that calls it:
public void GetConference (string url, Action action) { var webClient = new WebClient (); Debug.WriteLine ("Get remote data for conference"); webClient.DownloadStringCompleted += (sender, e) => { try { var r = e.Result; ConferenceData = DeserializeConference (r); } catch (Exception ex) { Debug.WriteLine ("ERROR deserializing downloaded conference XML: " + ex); } action(); }; webClient.Encoding = System.Text.Encoding.UTF8; webClient.DownloadStringAsync (new Uri (url)); }I noticed the “action();” call and could not figure out where that was coming from until I noticed it was the second paramter of GetConference(). Then, I looked at the call (first chunk of code) and there was a delegate!
Very cool. I feel like I should have know this but none the less, I do know.