2009-10-16 197 views
28

有沒有辦法讓部分類的構造函數調用另一個我的或者不可以定義的方法?部分類構造函數

基本上我的部分類構造函數定義:

public partial class Test 
{ 
    public Test() 
    { 
      //do stuff 
    } 
} 

我希望能夠以某種方式插入額外的代碼的類構造函數被調用後運行。

另外,有沒有辦法讓多個文件在構造函數被調用後注入額外的代碼?

回答

49

C#確實支持partial methods的功能。這些允許部分類定義來轉發聲明一個方法,然後可以選擇定義部分類的另一部分。

分部方法有一些限制:

  • 他們必須爲void類型(不歸)
  • 他們無法接受輸出參數的,但是他們也能接受ref參數
  • 它們不能被虛擬或EXTERN並且無法覆蓋或覆蓋另一種方法(通過「新」關鍵字)

部分方法隱式密封且私密。

然而,不可能讓部分類的兩個不同部分實現相同的部分方法。通常,在代碼生成的部分類中使用部分方法作爲允許擴展或自定義生成的部分的行爲的非生成部分(或者反之亦然)的一種方式。如果聲明瞭部分方法但未在任何類部分中實現,則編譯器將自動消除對其的任何調用。

下面是一個代碼示例:

public partial class PartialTestClass 
{ 
    partial void DoSomething(); 

    public PartialTestClass() { DoSomething(); } 
} 

public partial class PartialTestClass 
{ 
    partial void DoSomething() { /* code here */ } 
} 
+4

其實他們可以接受ref參數。他們不接受。 – 2009-10-16 21:35:04

+1

是的,謝謝Mircea,把它解決了。 – LBushkin 2009-10-16 21:36:07

+4

不幸的是,您不能在這些部分方法中爲'readonly'字段賦值,所以從技術上講,即使您決定只從構造函數中調用它們,也沒有部分構造函數。 – 2014-03-31 08:33:53

5

搜索「部分方法」。他們會做你想要的。

例如:

public partial class Test 
{ 
    public Test() 
    { 
     //do stuff 

     DoExtraStuff(); 
    } 

    partial void DoExtraStuff(); 
} 


public partial class Test // in some other file 
{ 
    partial void DoExtraStuff() 
    { 
     // do more stuff 
    } 
} 
7

那麼,在C#3.0,你可以有所謂分部方法 - 方法可以被調用,即使他們是不是真的存在。

如果它們沒有在任何部分類文件中定義,那麼對它們的調用將被.NET編譯器/鏈接器刪除。

所以你可以定義例如一個Customer類:

partial class Customer 
{ 
    string name; 

    public string Name 
    { 
    get 
    { 
     return name; 
    } 
    set 
    { 
     OnBeforeUpdateName(); 
     OnUpdateName(); 
     name = value; 
     OnAfterUpdateName(); 
    } 
    } 

    partial void OnBeforeUpdateName(); 
    partial void OnAfterUpdateName(); 
    partial void OnUpdateName(); 
} 

這些局部方法OnBeforeUpdateName()等將被調用,但如果你的部分類文件實際上沒有確實實現了他們什麼,該呼叫將無任何影響。 Linq-to-SQL將這段時間用於這些通知方法。

參見分部方法的博客文章:

馬克

+1

「子類」:使用部分方法的原因是有它的*同*類實現的,但不同的部分文件。如果它沒有在同一個類中實現,它將被編譯器刪除。 – itowlson 2009-10-16 21:31:00

+0

多個部分類是否可以聲明此方法,還是隻能聲明一次? – Omar 2009-10-16 21:31:36

+0

@itowlson:當然,對不起,得到了部分方法和繼承混淆:-) – 2009-10-16 21:33:57