2009-10-16 138 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