Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 此委托用法是好是坏?_C#_Templates_Delegates - Fatal编程技术网

C# 此委托用法是好是坏?

C# 此委托用法是好是坏?,c#,templates,delegates,C#,Templates,Delegates,之所以问这个问题,是因为我以前没有学员最佳实践的经验 我有一个无序的html列表,整个网站的结构都是相同的,但是列表的内容可能不同 示例: 对象A的列表 <ul> <li> <ul> <li>A.someMember1</li> <li>A.someMember2</li> <li>A.someMember3</li> </ul

之所以问这个问题,是因为我以前没有学员最佳实践的经验

我有一个无序的html列表,整个网站的结构都是相同的,但是列表的内容可能不同

示例:
对象A的列表

<ul>
  <li>
    <ul>
      <li>A.someMember1</li>
      <li>A.someMember2</li>
      <li>A.someMember3</li>
    </ul>
  </li>
</ul>
还有下面的方法

    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方法。你觉得这个怎么样


我的结构合理吗?还是我疯了?

为什么要传递代理来执行渲染?是否希望每个列表的呈现略有不同?如果您正在寻找一致性,我将只传递要渲染的对象列表以及一些标题文本,并在您的方法中进行渲染。例如,我建议的方法签名可能类似于:

private void RenderList<T>(HtmlTextWriter writer, string title, string headerText, List<T> objectsToRender) where T : IRender
private void RenderList(HtmlTextWriter编写器、字符串标题、字符串标题文本、列表对象存储器),其中T:IRender
也就是说,如果每个列表都应该以独特的方式呈现,那么我不认为你比我脑海中的声音更疯狂

更新

我想我需要扩展我的代码示例

private void RenderList<T>(HtmlTextWriter writer, string title, string headerText, List<T> objectsToRender) where T : IRender
{
    writer.RenderBeginTag(HtmlTextWriterTag.Fieldset);

    writer.RenderBeginTag(HtmlTextWriterTag.Legend);
    writer.HtmlEncode(title);
    writer.RenderEndTag();//end Legend

    writer.AddAttribute(HtmlTextWriterAttribute.Class, "resultList");
    writer.RenderBeginTag(HtmlTextWriterTag.Ul);
    {
        writer.RenderBeginTag(HtmlTextWriterTag.Div); //begin Header
        writer.AddAttribute(HtmlTextWriterAttribute.Class, "header");
        writer.HtmlEncode(headerText);
        writer.RenderEndTag(); //end Header

        // render all objects
        foreach (T obj in objectsToRender)
        {
            writer.RenderBeginTag(HtmlTextWriterTag.Li); // begin Custom Object Rendering
            obj.CustomRender(writer);
            writer.RenderEndTag(); // end Custom Object Rendering
        }
    }
    writer.RenderEndTag();//ul

    writer.RenderEndTag(); //fieldset
}

// IRender interface
public interface IRender
{
    void CustomRender(HtmlTextWriter writer);
}
private void RenderList(HtmlTextWriter编写器、字符串标题、字符串标题文本、列表对象存储器),其中T:IRender
{
writer.RenderBeginTag(htmltextwittertag.Fieldset);
writer.RenderBeginTag(htmltextwittertag.Legend);
作者:HtmlEncode(标题);
writer.renderndtag();//结束图例
writer.AddAttribute(HtmlTextWriterAttribute.Class,“结果列表”);
writer.RenderBeginTag(htmltextwittertag.Ul);
{
writer.RenderBeginTag(HtmlTextWriterTag.Div);//开始标头
writer.AddAttribute(HtmlTextWriterAttribute.Class,“头”);
writer.HtmlEncode(headerText);
writer.renderndtag();//结束标头
//渲染所有对象
foreach(objectsToRender中的目标)
{
writer.RenderBeginTag(HtmlTextWriterTag.Li);//开始自定义对象渲染
对象自定义渲染(编写器);
writer.renderndtag();//结束自定义对象渲染
}
}
writer.renderndtag();//ul
writer.renderndtag();//字段集
}
//IRender接口
公共接口IRender
{
void CustomRender(HtmlTextWriter);
}

我选择一个通用方法
Render(HtmlTextWriter)
并将所有其他参数定义为类的属性:

interface IRenderable
{
    void Render(HtmlTextWriter writer);
}

class ListComponent : IRenderable
{
    public List<IRenderable> Items { get; set; }
    public string Title { get; set; }

    public void Render(HtmlTextWriter writer)
    {
        writer.RenderBeginTag(HtmlTextWriterTag.Fieldset);

        writer.RenderBeginTag(HtmlTextWriterTag.Legend);
        writer.HtmlEncode(Title);
        writer.RenderEndTag();//end Legend

        writer.AddAttribute(HtmlTextWriterAttribute.Class, "resultList");
        writer.RenderBeginTag(HtmlTextWriterTag.Ul);

        foreach (var item in Items)
        {
            writer.RenderBeginTag(HtmlTextWriterTag.Li);
            item.Render(writer);
            writer.RenderEndTag();//li
        }

        writer.RenderEndTag();//ul

        writer.RenderEndTag(); //fieldset
    }
}
接口IRenderable
{
无效渲染(HtmlTextWriter);
}
类ListComponent:IRenderable
{
公共列表项{get;set;}
公共字符串标题{get;set;}
公共void呈现(HtmlTextWriter)
{
writer.RenderBeginTag(htmltextwittertag.Fieldset);
writer.RenderBeginTag(htmltextwittertag.Legend);
作者:HtmlEncode(标题);
writer.renderndtag();//结束图例
writer.AddAttribute(HtmlTextWriterAttribute.Class,“结果列表”);
writer.RenderBeginTag(htmltextwittertag.Ul);
foreach(项目中的var项目)
{
writer.RenderBeginTag(htmltextwittertag.Li);
项目.提交(作者);
writer.renderndtag();//li
}
writer.renderndtag();//ul
writer.renderndtag();//字段集
}
}

我想这是个不错的决定。然而,我认为最好是创建用于生成列表的特殊接口(或抽象类)

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

我们可以对标记进行投票吗?你说的“投票标记”是什么意思?你可以使用它进行投票;)+“我疯了”的标签是1。我个人会使用UserControl而不是自定义控件,但我不认为在使用委托时有什么不好的地方。@Gabe Moothart:我个人会使用UserControl而不是自定义控件,你会以什么方式使用UserControl?使用repeater?我之所以选择它,是因为与我以前的解决方案相比,它在实现时会产生更多有组织的代码。我选择创建一个接口
interface IRenderable
{
    void Render(HtmlTextWriter writer);
}

class ListComponent : IRenderable
{
    public List<IRenderable> Items { get; set; }
    public string Title { get; set; }

    public void Render(HtmlTextWriter writer)
    {
        writer.RenderBeginTag(HtmlTextWriterTag.Fieldset);

        writer.RenderBeginTag(HtmlTextWriterTag.Legend);
        writer.HtmlEncode(Title);
        writer.RenderEndTag();//end Legend

        writer.AddAttribute(HtmlTextWriterAttribute.Class, "resultList");
        writer.RenderBeginTag(HtmlTextWriterTag.Ul);

        foreach (var item in Items)
        {
            writer.RenderBeginTag(HtmlTextWriterTag.Li);
            item.Render(writer);
            writer.RenderEndTag();//li
        }

        writer.RenderEndTag();//ul

        writer.RenderEndTag(); //fieldset
    }
}
public abstract class ListRenderer
{
  public abstract IEnumerable Items {get;}
  public abstract String GenerateHeaderText();
  public String GenerateItemText(objectItem);
  public abstract void RenderList(TextWriter writer);
}