有人问这个问题是因为我以前没有与代表最佳做法相关的经验

我在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/

10-11 13:23