将接口作为参数传递给扩展方法

qui*_*qui 4 c# asp.net-mvc extension-methods interface

我使用扩展方法扩展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;
    }
Run Code Online (Sandbox Code Playgroud)

所以我让我的一个业务对象实现IRSSable,并尝试将其传递给HTML帮助器.但我似乎无法使它工作,我尝试过:

<%=Html.RSSRepeater(ViewData.Model.GetIssues(null, null, "") as IEnumerable<IRSSable>) %>
Run Code Online (Sandbox Code Playgroud)

编译正常,但传递null

<%=Html.RSSRepeater(ViewData.Model.GetIssues(null, null, "")) %>
Run Code Online (Sandbox Code Playgroud)

Intellisense抱怨无法将IEnumerable问题传递给IEnumberable IRSSable

  • 你是怎么做到的?我正在调用的那种方法IEnumberable<Issue>肯定会返回并且问题肯定会实现IRSSAble

Mar*_*ell 14

啊......试试:

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

然后,这应该允许您传递实现的任何序列IRSSable- 并且泛型类型推断应该意味着您不需要自己指定T(as Issue) - 编译器将处理它.

顺便说一下 - 避免在这里连接 ; StringBuilder最好是:

    StringBuilder result = new StringBuilder();

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

    return result.ToString();
Run Code Online (Sandbox Code Playgroud)