この場合、さまざまな型を扱っているため、コードを汎用にするために、それぞれに共通のインターフェイスを実装する必要があります。基本的なアプローチは、必要なプロパティ (DisplayText、ActionURL など) を含むインターフェイスを作成し、コレクションを再帰的に反復することです。
大まかな例を次に示します。
public interface IDataItem
{
string DisplayText { get; }
string ActionUrl { get; }
bool HasChildren { get; }
IEnumerable<IDataItem> GetChildren();
}
public void CreateTree(HtmlTextWriter writer, IEnumerable<IDataItem> collection)
{
writer.WriteFullBeginTag("ul");
foreach (var data in collection)
{
writer.WriteFullBeginTag("li");
writer.WriteBeginTag("a");
writer.WriteAttribute("href",data.ActionUrl);
writer.Write(HtmlTextWriter.TagRightChar);
writer.Write(data.DisplayText);
writer.WriteEndTag("a");
if(data.HasChildren)
CreateTree(writer, data.GetChildren());
writer.WriteEndTag("li");
}
writer.WriteEndTag("ul");
}
ツリービューに含める各タイプにインターフェイスを実装する必要があります。最上位の型のコレクションを渡すだけで、上記のメソッドは必要なネストされたリストを作成する階層をたどります。