我已经使用扩展方法来扩展 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/