2008-11-28 75 views
4

我已經使用擴展方法來擴展HTML輔助做出的RSS轉發:傳遞接口作爲參數的擴展方法

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

所以我讓我的業務對象的一個​​實施IRSSable,並試圖通過這種到HTML幫手。但我似乎無法使它工作,我曾嘗試:

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

編譯罰款,但傳遞null

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

智能感知呻吟約不能夠IEnumerable的問題傳遞給IEnumberable IRSSable

  • 那麼你怎麼做呢?這個方法我打電話definitly返回IEnumberable<Issue>和問題definitly實現IRSSAble
+0

沒有看到什麼GetIssues方法做就很難有把握地說。 – samjudson 2008-11-28 11:41:08

回答

14

啊,我會離開這裏這個答案...嘗試:

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

然後這應該允許您傳遞任何實現IRSSable的事物序列 - 並且泛型類型推斷應該意味着您不需要自己指定T(如Issue) - 編譯器將處理它。

順便說一下 - avoid concatenation here; StringBuilder最好:

StringBuilder result = new StringBuilder(); 

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

    return result.ToString(); 
+0

不錯 - 喜歡它。相信你退後一步,並從更好的方向接近它:) – 2008-11-28 11:44:22

4

您正在運行到generic variance issues。僅僅因爲實施了IEnumerable<Issue>並不意味着它實施了IEnumerable<IRssable>。 (它將在C#4中,但我假設你沒有使用它:)

你可以讓你的擴展方法只需要IEnumerable並且可以調用IEnumerable.Cast<IRssable>就可以了 - 這可能是最簡單的方法。

編輯:Marc's suggestion可能是最好的一個,但因爲它解釋發生了什麼事情,而不僅僅是修復:)

+0

是的,謝謝你的解釋。 – qui 2008-11-28 11:59:57

0

試試這個:

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