39

有没有办法让部分类的构造函数调用我或可能未定义的另一个方法?

基本上我的部分类构造函数被定义:

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

我希望能够在调用类构造函数后以某种方式插入要运行的额外代码。

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

4

3 回答 3

57

C# 确实支持部分方法的特性。这些允许部分类定义转发声明一个方法,然后部分类的另一部分可以选择定义。

部分方法有一些限制:

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

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

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

这是一个代码示例:

 public partial class PartialTestClass
 {
     partial void DoSomething();

     public PartialTestClass() { DoSomething(); }
 }

 public partial class PartialTestClass
 {
     partial void DoSomething()  { /* code here */ }
 }
于 2009-10-16T21:28:37.547 回答
9

搜索“部分方法”。他们会做你想做的事。

例如:

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
     }
}
于 2009-10-16T21:27:15.323 回答
8

好吧,在 C# 3.0 中,您可以拥有所谓的部分方法- 可以调用的方法,即使它们实际上并不存在。

如果它们没有在任何分部类文件中定义,对它们的调用将被 .NET 编译器/链接器删除。

所以你可以定义一个客户类:

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 将这段时间用于此类通知方法。

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

马克

于 2009-10-16T21:28:14.090 回答