2

我想制作一个具有流畅界面的静态类,但出现错误:

'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();

有没有办法做到这一点或解决方法?

4

4 回答 4

12

那是不可能的。您不能拥有静态类的实例。由于您已将 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();
于 2012-04-15T08:52:30.780 回答
1

return RouteBuilder 会成功的!

编辑:错了,对不起

对于这些情况,您也可以只做一个 Extension 类

 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()
于 2012-04-15T08:53:07.980 回答
0

我很惊讶该语言甚至允许这样做 - 您定义的方法清楚地返回一个实例,但是在同一个类定义中,您已经声明您永远不能创建它的实例。

您仍然可以在普通类上定义静态方法。您可以强制实现者始终使用流畅的接口,而不是MyClass通过以下方式实例化自己:

  • 给 MyClass 一个private MyClass()只能从内部调用的私有构造函数MyClass
  • 将 MyClass 标记为sealed防止创建暴露公共构造函数的继承者。
于 2012-04-15T08:58:21.003 回答
0

您不能在静态方法中使用“this”关键字,因为“this”返回类的当前实例。但是静态方法不属于任何实例(相反,它们属于类本身),因此不能返回它。

为什么你需要你的类和方法是静态的?删除所有静态关键字将使其工作。如果您,请改用单例模式

于 2012-04-15T09:02:34.603 回答