有人问这个问题是因为我以前没有与代表最佳做法相关的经验
我在html中有一个无序列表,其中整个网站的结构相同,但是列表的内容可能有所不同。
例子:
对象A的清单
<ul>
<li>
<ul>
<li>A.someMember1</li>
<li>A.someMember2</li>
<li>A.someMember3</li>
</ul>
</li>
</ul>
对象B的列表
<ul>
<li>
<ul>
<li>B.someMember1</li>
<li>B.someMember2</li>
<li>B.someMember3</li>
<li>B.someMember4</li>
</ul>
</li>
</ul>
我创建了两个代表:
protected delegate void RenderHtmlMethod(HtmlTextWriter writer);
protected delegate void RenderHtmlMethodWithObjects(HtmlTextWriter writer, object obj);
和以下方法
private void RenderList(HtmlTextWriter writer, string title, RenderHtmlMethod headingDelegate,
RenderHtmlMethodWithObjects itemsDelegate, object objToRender)
{
writer.RenderBeginTag(HtmlTextWriterTag.Fieldset);
writer.RenderBeginTag(HtmlTextWriterTag.Legend);
writer.HtmlEncode(title);
writer.RenderEndTag();//end Legend
writer.AddAttribute(HtmlTextWriterAttribute.Class, "resultList");
writer.RenderBeginTag(HtmlTextWriterTag.Ul);
{
headingDelegate(writer);
itemsDelegate(writer, objToRender);
}
writer.RenderEndTag();//ul
writer.RenderEndTag(); //fieldset
}
这样,我可以制作一些方法来呈现标题(只是另一个带有嵌入式ul的li),然后呈现每个对象列表所需的列表项。
我无法重新定义我的类以实现任何接口,尽管我可以为这些类创建一个包装器并在那里实现render方法。你怎么看待这件事?
我的结构有意义吗?还是我疯了?
最佳答案
我想这不是一个坏决定。但是,我认为最好是创建用于生成列表的特殊接口(或抽象类)。
public abstract class ListRenderer
{
public abstract IEnumerable Items {get;}
public abstract String GenerateHeaderText();
public String GenerateItemText(objectItem);
public abstract void RenderList(TextWriter writer);
}
然后,您只需围绕具体项目创建包装器,然后将此对象传递给生成器方法。如果您的列表是以通用方式构建的,则可以在ListRenderer中实现所有逻辑,然后仅覆盖GenerateHeaderText和GenerateItemText
关于c# - 这个委托(delegate)用法是好是坏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1572687/