C# 返回';这';用静态的方法

C# 返回';这';用静态的方法,c#,.net,this,static-classes,C#,.net,This,Static Classes,我想创建一个具有流畅界面的静态类,但我得到了一个错误: “this”在静态属性、方法中无效 这是我的密码: public static MyClass { private static StringBuilder builder; private static StringBuilder RouteBuilder { get { if (builder == null) builder

我想创建一个具有流畅界面的静态类,但我得到了一个错误:

“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()和()


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

这是不可能的。不能有静态类的实例。因为您已经将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();

返回RouteBuilder将成功

编辑:错误,抱歉

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

像这样使用它

var builder = new StringBuilder();
builder.Root().Append()

我感到惊讶的是,语言甚至允许这样做——您定义的方法明确地返回一个实例,但在同一个类定义中,您声明您永远不能创建它的实例

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

  • 给MyClass一个只能从内部调用的私有构造函数
    private MyClass()
  • 将MyClass标记为密封的
,以防止创建公开公共构造函数的继承器
不能在静态方法中使用'this'关键字,因为'this'返回类的当前实例。但静态方法不属于任何实例(相反,它们属于类本身),因此无法返回它


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

您希望静态方法中的
这个
是什么?我最近写了一篇关于fluent builder接口的文章,这可能会有帮助,但它仍然不利于您的更改,因为返回
StringBuilder
并不能传达您的意图。在
StringBuilder
上使用名为
的方法毫无意义。我同意你的看法。这只是一种扩展方法的示例。名为MyClass的类也不是那么明确;)但我想你的意思是,这种扩展在“封闭”类中更好,而不是像纯StringBuilder扩展那样,我也同意这一点。
var builder = new StringBuilder();
builder.Root().Append()