2012-04-15 45 views
2

我想作一個靜態類,流暢的界面,但我得到的錯誤:返回「這」在靜態方法

'this' is not valid in a static property, method ...

這裏是我的代碼:

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

有沒有辦法做到這一點或解決方法?

+2

你想要什麼'這個'在你的靜態方法? – jalf 2012-04-15 08:59:52

+1

我寫了一篇關於流暢構建器接口的[博客文章](http://mattdavey.me/2012/03/08/practical-applications-of-the-adaptive-interface-pattern-the-fluent-builder-context/)最近可能會有所幫助 – MattDavey 2012-04-15 09:00:22

回答

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

回報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() 
+0

由於返回一個'StringBuilder'不能傳達你正在做的事情的意圖,所以你的修改仍然不好。在'StringBuilder'上調用'And'方法是沒有意義的。 – CodesInChaos 2012-04-15 09:15:13

+0

好吧,我同意你的意見。這只是擴展方式的一個示例。一個名爲MyClass的類並不那麼明確;)但我認爲你的意思是這些類型的擴展在「關閉」類中更好,而不是純粹的StringBuilder擴展,我同意這一點。 – 2012-04-15 09:55:09

0

我很驚訝,語言甚至允許這種方法你明確地定義了返回一個實例,但是在同一個類定義中,你已經聲明你不能創建它的實例。

您仍然可以在普通類上定義靜態方法。您可以強制執行者總是使用流暢的界面,而不是通過實例MyClass自己:

  • 給予MyClass的私有構造private MyClass()只能從內部MyClass
  • 標記MyClass的作爲sealed稱爲防止傳承人的創造,公開構造函數。
0

你不能在靜態方法中使用'this'關鍵字,因爲'this'返回類的CURRENT INSTANCE。但是靜態方法不屬於任何實例(相反,它們屬於類本身),因此不能返回它。

爲什麼你需要你的類和方法是靜態的?刪除所有靜態關鍵字將使其工作。如果你使用Singleton pattern代替。