【问题标题】:Partial Class Constructors部分类构造函数
【发布时间】:2009-10-16 21:24:15
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# .net constructor partial-classes


    【解决方案1】:

    C# 确实支持partial methods 的特性。这些允许分部类定义前向声明分部类的另一部分可以选择定义的方法。

    部分方法有一些限制:

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

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

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

    这是一个代码示例:

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

    【讨论】:

    • 其实他们可以接受 ref 参数。他们不接受。
    • 不幸的是,您不能从这些部分方法中为 readonly 字段赋值,因此即使您决定只从构造函数中调用它们,从技术上讲也不存在部分构造函数。
    【解决方案2】:

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

    例如:

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

    【讨论】:

      【解决方案3】:

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

      查看关于部分方法的博客文章:

      马克

      【讨论】:

      • “后代类”:使用分部方法的原因是让它在相同的类中实现,但在不同的分部文件中。如果它没有在同一个类中实现,它会被编译器删除。
      • 是否可以多个分部类声明该方法,还是只能声明max一次?
      • @itowlson:当然,抱歉,把部分方法和继承搞混了:-)
      • @Unknown:它可以在所有的部分类文件中声明和实现一次。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多