我想创建一个具有流畅界面的静态类,但我收到错误:
'this'在静态属性中无效,方法......
这是我的代码:
public static MyClass
{
private static StringBuilder builder;
private static StringBuilder RouteBuilder
{
get
{
if (builder == null)
builder = new StringBuilder();
return builder;
}
}
public static MyClass Root()
{
RouteBuilder.Append("/");
return this;
}
public static MyClass And()
{
RouteBuilder.Append("and");
return this;
}
public static MyClass Something()
{
RouteBuilder.Append("something");
return this;
}
}
这使我能够MyClass.Root().And().Something();
有没有办法做到这一点或解决方法?
答案 0 :(得分:11)
那是不可能的。您不能拥有静态类的实例。由于您已将MyClass标记为静态,因此不能有任何实例。不要让它静止:
public class MyClass
{
private StringBuilder builder;
private StringBuilder RouteBuilder
{
get
{
if (builder == null)
builder = new StringBuilder();
return builder;
}
}
public MyClass Root()
{
RouteBuilder.Append("/");
return this;
}
public MyClass And()
{
RouteBuilder.Append("and");
return this;
}
public MyClass Something()
{
RouteBuilder.Append("something");
return this;
}
}
然后你可以链接:
var result = new MyClass().Root().And().Something();
答案 1 :(得分:1)
返回RouteBuilder会成功!
编辑:错误,抱歉
对于这些情况,您也可以只进行扩展类
说
public static class StringBuilderExtensions {
public static StringBuilder Root(this StringBuilder builder) {
Asserts.IsNotNull(builder);
builder.Append("/");
return builder;
}
public static StringBuilder And(this StringBuilder builder) {
Asserts.IsNotNull(builder);
builder.Append("and");
return builder;
}
//...etc
}
并像
一样使用它var builder = new StringBuilder();
builder.Root().Append()
答案 2 :(得分:0)
我很惊讶语言甚至允许这样 - 你定义的方法清楚地返回一个实例,但是在同一个类定义中,你已经声明你不能创建它的实例。
您仍然可以在普通类上定义静态方法。您可以强制实施者始终使用流畅的界面,而不是通过以下方式实例化MyClass
:
private MyClass()
内部调用的私有构造函数MyClass
sealed
,以防止创建公开构造函数的继承者。答案 3 :(得分:0)
你不能在静态方法中使用'this'关键字,因为'this'返回class的CURRENT INSTANCE。但是静态方法不属于任何实例(相反,它们属于类本身),因此无法返回它。
为什么你需要你的类和方法是静态的?删除所有静态关键字将使其工作。如果您使用Singleton pattern代替。