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

そこで、ビジネス オブジェクトの 1 つに IRSSable を実装させ、これを HTML ヘルパーに渡そうとします。しかし、私はそれを機能させることができないようです、私は試しました:

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

正常にコンパイルされますが、null が渡されます

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

Intellisense は、IEnumerable の問題を IEnumberable IRSSable に渡すことができないことについて嘆きます

  • それで、あなたはそれをどのようにしますか?私が呼び出しているそのメソッドは間違いなく戻りIEnumberable<Issue>、Issueは間違いなくIRSSAbleを実装しています
4

3 に答える 3

14

ああ...試してください:

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

これにより、実装する一連のものを渡すことができるようになります-そして、ジェネリック型の推論は、 (as ) を自分IRSSableで指定する必要がないことを意味するはずです-コンパイラーがそれを処理します。TIssue

ところで、ここでは連結を避けてくださいStringBuilderが好ましい:

    StringBuilder result = new StringBuilder();

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

    return result.ToString();
于 2008-11-28T11:42:13.523 に答える
4

一般的な差異の問題が発生しています。何かが実装されているからIEnumerable<Issue>といって、実装されているとは限りませんIEnumerable<IRssable>。(C#4ではそうですが、それを使用していないと思います:)

ただし、拡張メソッドをただ取り、それIEnumerableを呼び出すようにすることもできますIEnumerable.Cast<IRssable>。これがおそらく最も簡単な方法です。

編集:マークの提案はおそらくより良いものですが、修正だけでなく何が起こっているのかを説明するので、この回答をここに残します:)

于 2008-11-28T11:41:14.617 に答える
0

これを試して:

<%=Html.RSSRepeater(ViewData.Model.GetIssues(null, null, "").Cast<IRSSable>()) %>
于 2008-11-28T11:43:37.187 に答える