2

流畅接口的基本特征之一是,通常声明为的方法void将返回可用的东西,通常是它们所属的类的实例(即this)。StringBuilder 举例说明了这种约定,虽然它本身并不完全流畅,但它确实为您提供了链式方法调用的便利:

sb.Append("Foo")
  .Append("Bar")
  .AppendLine();

System.Web.Mvc.TagBuilder但是,不遵循此约定;方法都是void

一种快速而肮脏的整理方法可能是将私有 TagBuilder( _instance) 封装在一个FluentTagBuilder类中,然后实现所有相同的方法,但将工作委托给实例并返回this而不是void.

实现这一目标的最好的不那么快速和肮脏的方法是什么?继承显然不行,因为方法只会因返回类型而异。如果可能的话,我宁愿保持简单并且不涉及模拟/替换框架。感谢您分享的任何智慧!

4

2 回答 2

2

您可以创建一个扩展方法来传播构建器对象:

public static T Do<T>(this T obj, Action<T> action)
{
    action(obj);
    return obj;
}

TagBuilder builder;
builder.Do(b => b.SetInnerText("text"))
       .Do(b => b.AddCssClass("class"))
       .Do(b => b.GenerateId("id"));
于 2013-02-20T23:12:45.620 回答
1

我刚刚创建了一个小型 Git 存储库,并启动了一个工具来执行此操作。

它非常业余,编码很糟糕,并且有很多问题,是的,但是你它很简单,你可以适应它。

Fluentizer 抓取一个类,通过反射生成一个新的类,封装了原有的方法。

在此处检查Fluentizer

于 2013-02-21T11:27:43.360 回答