如何在C#中声明一个类,以便我可以链接方法?

时间:2012-03-30 04:50:22

标签: c# .net

我有一个用于构建表字符串的自定义类。我想重写代码,以便我可以链接运算符。类似的东西:

myObject
  .addTableCellwithCheckbox("chkIsStudent", isUnchecked, isWithoutLabel)
  .addTableCellwithTextbox("tbStudentName", isEditable) etc.

所以看起来我会让这些方法(函数)中的每一个都返回对象本身,这样我就可以在结果对象上调用另一个方法(函数),但我无法弄清楚如何获得ac#class引用自己。

任何帮助?

5 个答案:

答案 0 :(得分:7)

使用this关键字作为返回值,这样您就会返回自己并且可以永久链接:

ClassName foo()
{
    return this;
}

答案 1 :(得分:7)

此表示法称为Fluent

对于您的示例,最简单的形式是

public class MyObject {
    public MyObject addTableCellwithCheckbox(...) { 
        ... 
        return this;
    }
    public MyObject addTableCellwithTextbox(...) {
        ...
        return this;
    }
}

在更漂亮的形式中,使用这些方法声明接口(例如,IMyObject),并让MyObject类实现该接口。返回类型必须是接口,如上面的Wikipedia示例所示。

如果无法访问该类的源代码,您也可以以类似的方式实现扩展类。

答案 2 :(得分:6)

所以你要创建一个像这样流畅的界面:

class FluentTable 
{
  //as a dumb example I'm using a list
  //use whatever structure you need to store your items
  List<string> myTables = new List<string>();

  public FluentTable addTableCellwithCheckbox(string chk, bool isUnchecked, 
                                                        bool  isWithoutLabel)
  {
    this.myTables.Add(chk);
    //store other properties somewhere
    return this;
  }

  public FluentTable addTableCellwithTextbox(string name, bool isEditable)
  {
    this.myTables.Add(name);
    //store other properties somewhere
    return this;
  }
  public static FluentTable New()
  {
    return new FluentTable();
  }
}

现在你可以像这样使用它:

  FluentTable tbl = FluentTable
                    .New()
                    .addTableCellwithCheckbox("chkIsStudent", true, false)
                    .addTableCellwithTextbox("tbStudentName", false);

这应该让您基本了解如何进行此操作。请参阅fluent interfaces on wikipedia

更正确的方法是实现一个流畅的界面:

interface IFluentTable
{
 IFluentTable addTableCellwithCheckbox(string chk, bool isUnchecked, 
                                                        bool  isWithoutLabel)
 IFluentTable addTableCellwithTextbox(string name, bool isEditable)
 //maybe you could add the static factory method New() here also 
}

然后实施它:class FluentTable : IFluentTable {}

答案 3 :(得分:3)

这应该让你接近。

public class SomeObject
{ 
    public SomeObject AddTableCellWithCheckbox(string cellName, bool isChecked)
    {
        // Do your add.

        return this;
    }
}
祝你好运, 汤姆

答案 4 :(得分:0)

确保每个方法都返回一个接口,声明要在链上调用的方法。

EX public IAdd Add()

这样,如果IAdd定义了一个add方法,你可以在Add添加后调用Add。显然,你可以将otterh方法添加到同一个界面。 这通常称为流畅的API