c# - 将接口(interface)作为参数传递给扩展方法

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

所以我让我的业务对象之一实现 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

最佳答案

啊...尝试:

 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();

关于c# - 将接口(interface)作为参数传递给扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/325561/

相关文章:

c# - 将 null 文字或可能的 null 值转换为不可为 null 的类型,尽管有 null 合并运算符

c# - 在 MVC 中使用 DBCONTEXT 类的正确方法

c# - 将复杂对象模型绑定(bind)到 View

c# - 授权过滤器在我的 mvc 项目中不起作用

c# - 在 Controller 中创建函数的 MVC 最佳实践

c# - "T @this"在委托(delegate)声明中是什么意思?

c# - 如何编写一个将不同类型作为参数的泛型方法?

generics - 泛型类型的扩展方法,带有额外的泛型类型参数

ios - 从扩展文件中检测设备 (Swift)

c# - GC.KeepAlive 与使用