2008-11-28 5 views
4

J'ai utilisé des méthodes d'extension pour étendre les aides html pour faire un répéteur RSS:Passing Interface en tant que paramètre à une méthode d'extension

public static string RSSRepeater(this HtmlHelper html, IEnumerable<IRSSable> rss) 
    { 
     string result=""; 

     foreach (IRSSable item in rss) 
     { 
      result += "<item>" + item.GetRSSItem().InnerXml + "</item>"; 
     } 

     return result; 
    } 

Alors je fais un de mes objets métier outil IRSSable, et essayer de transmettre cette à l'aide HTML. Mais je ne peux pas sembler le faire fonctionner, j'ai essayé:

<%=Html.RSSRepeater(ViewData.Model.GetIssues(null, null, "") as IEnumerable<IRSSable>) %> 

Compile bien, mais nul est passé

<%=Html.RSSRepeater(ViewData.Model.GetIssues(null, null, "")) %> 

IntelliSense se plaint de ne pas pouvoir passer question IEnumerable à IEnumberable IRSSable

  • Alors, comment faites-vous? Cette méthode, je fais appel retourne IEnumberable<Issue> et definitly Edition implémente definitly IRSSAble
+0

Sans voir ce que la méthode GetIssues fait, il est très difficile de dire avec certitude. – samjudson

Répondre

14

Ahh ... essayez:

public static string RSSRepeater<T>(this HtmlHelper html, IEnumerable<T> rss) 
    where T : IRSSable 
{ 
    ... 
} 

Cela devrait alors vous permettre de passer toute séquence de choses qui implémentent IRSSable - et l'inférence de type générique devrait signifier que vous n'avez pas besoin de spécifier le T (comme Issue) vous-même - le compilateur va le gérer.

Par ailleurs - avoid concatenation here; StringBuilder est préférable:

StringBuilder result = new StringBuilder(); 

    foreach (IRSSable item in rss) 
    { 
     result.Append("<item>").Append(item.GetRSSItem().InnerXml).Append("</item>"); 
    } 

    return result.ToString(); 
+0

Nice - comme ça. Faites-vous confiance pour prendre du recul et l'approcher d'une meilleure direction :) –

+0

Excellent! Cela me permet de le garder agréable et élégant. Si je pouvais vous voter deux fois, je le ferais Merci – qui

+0

Merci Marc, je n'ai jamais su cela. Il y a clairement une raison pour laquelle vous avez 11k points: p – qui

4

Vous en cours d'exécution dans generic variance issues. Juste parce que quelque chose implémente IEnumerable<Issue> ne signifie pas qu'il implémente IEnumerable<IRssable>. (Il sera en C# 4, mais je suppose que vous n'utilisez pas cela :)

Vous pouvez faire votre méthode d'extension prendre seulement IEnumerable et appelez IEnumerable.Cast<IRssable> dessus cependant - c'est probablement l'approche la plus simple.

EDIT: Marc's suggestion est probablement le meilleur, mais je vais laisser cette réponse ici car il explique ce qui se passe plutôt que le correctif :)

+0

Oui, merci pour l'explication. – qui

0

Essayez ceci:

<%=Html.RSSRepeater(ViewData.Model.GetIssues(null, null, "").Cast<IRSSable>()) %>