Я использовал методы расширения для расширения помощников 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.




Вы столкнулись с общие проблемы отклонения. То, что что-то реализует IEnumerable<Issue>, не означает, что оно реализует IEnumerable<IRssable>. (Это будет в C# 4, но я предполагаю, что вы этим не пользуетесь :)
Вы можете заставить свой метод расширения использовать только IEnumerable и вызывать на нем IEnumerable.Cast<IRssable> - это, вероятно, самый простой подход.
Обновлено: Предложение Марка, вероятно, лучше, но я оставлю этот ответ здесь, поскольку он объясняет, что происходит, а не просто исправление :)
Ааа ... попробуйте:
public static string RSSRepeater<T>(this HtmlHelper html, IEnumerable<T> rss)
where T : IRSSable
{
...
}
Это должно позволить вам передать любую последовательность вещей, реализующих IRSSable, а вывод общего типа должен означать, что вам не нужно указывать T (как Issue) самостоятельно - компилятор обработает это.
Кстати - избегайте конкатенации здесь; StringBuilder предпочтительнее:
StringBuilder result = new StringBuilder();
foreach (IRSSable item in rss)
{
result.Append("<item>").Append(item.GetRSSItem().InnerXml).Append("</item>");
}
return result.ToString();
Красиво - нравится. Поверьте, вы сделаете шаг назад и подойдете к нему с лучшего направления :)
Превосходно! Это позволяет мне сохранять его красивым и элегантным. Если бы я мог проголосовать за тебя дважды, я бы спасибо
Спасибо, Марк, я этого не знал. Совершенно очевидно, что у вас есть 11к баллов: p
Попробуй это:
<%=Html.RSSRepeater(ViewData.Model.GetIssues(null, null, "").Cast<IRSSable>()) %>
Не видя, что делает метод GetIssues, очень трудно сказать с уверенностью.