部分类构造函数

40

有没有一种方法可以让局部类的构造函数调用另一个可能已经定义或未定义的方法?

基本上,我的局部类构造函数被定义为:

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

我希望能够在类构造函数调用后插入额外的代码。

另外,有没有办法在构造函数调用后注入多个文件中的额外代码?

3个回答

60

C#支持 partial methods 特性。这允许一个部分类定义一个方法声明,然后由另一部分可以选择地定义。

Partial 方法有一些限制:

  • 它们必须是 void 类型(无返回)
  • 不能接受 out 参数,但可以接受 ref 参数
  • 它们不能是虚拟的或者外部的,也不能通过 "new" 关键字覆盖另一个方法

Partial 方法是隐式密封和私有的。

然而,在同一个 partial 类的两个不同部分中实现相同的 partial 方法是不可能的。通常情况下,partial 方法在代码生成的 partial 类中被使用,作为一种允许非生成部分扩展或自定义生成部分行为的方式(有时反过来)。如果一个 Partial 方法被声明但没有在任何类部分中实现,则编译器将自动消除对它的任何调用。

下面是一个代码示例:

 public partial class PartialTestClass
 {
     partial void DoSomething();

     public PartialTestClass() { DoSomething(); }
 }

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

4
实际上,它们可以接受 ref 参数。但它们不接受 out 参数。 - Mircea Grelus
9
很遗憾,你不能在这些部分类方法中分配值给“readonly”字段,因此即使你决定只从构造函数调用它们,从技术上讲,也没有部分类构造函数。 - C.Evenhuis
这个答案是不正确的。部分类方法绝对可以有除void之外的返回类型,接受out参数,或者是虚拟的,重写的,密封的,新的或外部的。不能的是那些事情为真,而且也没有为部分类方法提供实现。你还错过了一个问题,就是如果你不打算提供实现,就不能添加访问修饰符。 - gamesaucer

9

搜索“partial methods”。它们可以完全满足你的需求。

例如:

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
     }
}

9
在C# 3.0中,你可以使用被称为“partial methods”的方法 - 即使它们并不存在,也可以调用它们。
如果它们没有在任何部分类文件中定义,那么.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在这种通知方法方面大量使用。

请参阅有关部分类方法的博客文章:

Marc


1
“子类”:使用部分类方法的原因是将其实现在同一类中,但不同的部分类文件中。如果它没有在同一类中实现,编译器会将其删除。 - itowlson
多个部分类是否可以声明此方法,还是只能声明一次? - Omar
@itowlson:当然,抱歉,我把部分方法和继承搞混了 :-) - marc_s
@Unknown:在所有的部分类文件中,它可以被声明并且只有一个实现。 - marc_s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接