部分类构造函数

Oma*_*mar 33 .net c# constructor partial-classes

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

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

public partial class Test
{
     public Test()
     {
          //do stuff
     }
}
Run Code Online (Sandbox Code Playgroud)

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

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

LBu*_*kin 52

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

部分方法有一些限制:

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

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

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

这是一个代码示例:

 public partial class PartialTestClass
 {
     partial void DoSomething();

     public PartialTestClass() { DoSomething(); }
 }

 public partial class PartialTestClass
 {
     partial void DoSomething()  { /* code here */ }
 }
Run Code Online (Sandbox Code Playgroud)

  • 遗憾的是,你不能从这些部分方法中为`readonly`字段赋值,所以从技术上讲,即使你决定只从构造函数中调用它们,也没有部分构造函数. (5认同)
  • 实际上他们可以接受ref参数.他们不接受. (4认同)

mar*_*c_s 8

好吧,在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();
}
Run Code Online (Sandbox Code Playgroud)

将调用那些部分方法OnBeforeUpdateName()等,但如果你的所有部分类文件实际上都没有为它们实现任何内容,那么该调用将没有任何效果.Linq-to-SQL将这段时间用于这些通知方法.

查看有关部分方法的博文:


Nei*_*eil 7

搜索"部分方法".他们会完全按照你的意愿行事.

例如:

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
     }
}
Run Code Online (Sandbox Code Playgroud)