我有一个用于构建表字符串的自定义类。我想重写代码,以便我可以链接运算符。类似的东西:
myObject
.addTableCellwithCheckbox("chkIsStudent", isUnchecked, isWithoutLabel)
.addTableCellwithTextbox("tbStudentName", isEditable) etc.
所以看起来我会让这些方法(函数)中的每一个都返回对象本身,这样我就可以在结果对象上调用另一个方法(函数),但我无法弄清楚如何获得ac#class引用自己。
任何帮助?
答案 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