当前位置:  开发笔记 > 编程语言 > 正文

使用另一个部分类覆盖部分类的默认构造函数

如何解决《使用另一个部分类覆盖部分类的默认构造函数》经验,为你挑选了3个好方法。

我不认为这是可能的,但如果是,那么我需要它:)

我有一个由Visual Studio 2008从wsdl.exe命令行工具自动生成的代理文件.

代理输出是部分类.我想覆盖生成的默认构造函数.我宁愿不修改代码,因为它是自动生成的.

我尝试制作另一个部分类并重新定义默认构造函数,但这不起作用.然后我尝试使用覆盖和新关键字,但这不起作用.

我知道我可以继承部分类,但这意味着我必须将所有源代码更改为指向新的父类.我宁愿不必这样做.

任何想法,解决方法或黑客?

//Auto-generated class
namespace MyNamespace {
   public partial class MyWebService : System.Web.Services.Protocols.SoapHttpClientProtocol {
      public MyWebService() {
         string myString = "auto-generated constructor";
         //other code...
      }
   }
}

//Manually created class in order to override the default constructor
namespace MyNamespace {
   public partial class MyWebService : System.Web.Services.Protocols.SoapHttpClientProtocol {
      public override MyWebService() { //this doesn't work
         string myString = "overridden constructor";
         //other code...
      }
   }
}

Tom Chantler.. 68

我有一个类似的问题,我生成的代码是由dbml文件创建的(我使用的是Linq-to-SQL类).

在生成的类中,它在构造函数的末尾调用一个名为OnCreated()的部分void.

长话短说,如果你想保留的重要构造的东西生成的类为你做(这你应该做的),然后在局部类创建以下文件:

partial void OnCreated()
{
    // Do the extra stuff here;
}

现在这是一个投票困境......与OP问题没有任何关系,这与L2S无关,所以不会有OnCreated,但你已经阻止我撞到桌子上,所以我认为+1. (3认同)


configurator.. 39

这是不可能的.部分类基本上是同一类的一部分; 没有方法可以定义两次或重写,包括构造函数.

您可以在构造函数中调用方法,并仅在其他零件文件中实现它.



1> Tom Chantler..:

我有一个类似的问题,我生成的代码是由dbml文件创建的(我使用的是Linq-to-SQL类).

在生成的类中,它在构造函数的末尾调用一个名为OnCreated()的部分void.

长话短说,如果你想保留的重要构造的东西生成的类为你做(这你应该做的),然后在局部类创建以下文件:

partial void OnCreated()
{
    // Do the extra stuff here;
}


现在这是一个投票困境......与OP问题没有任何关系,这与L2S无关,所以不会有OnCreated,但你已经阻止我撞到桌子上,所以我认为+1.

2> configurator..:

这是不可能的.部分类基本上是同一类的一部分; 没有方法可以定义两次或重写,包括构造函数.

您可以在构造函数中调用方法,并仅在其他零件文件中实现它.



3> 小智..:

嗯,我认为一个优雅的解决方案如下:

//* AutogenCls.cs file
//* Let say the file is auto-generated ==> it will be overridden each time when
//* auto-generation will be triggered.
//*
//* Auto-generated class, let say via xsd.exe
//*
partial class AutogenCls
{
    public AutogenCls(...)
    {
    }
}



//* AutogenCls_Cunstomization.cs file
//* The file keeps customization code completely separated from 
//* auto-generated AutogenCls.cs file.
//*
partial class AutogenCls
{
    //* The following line ensures execution at the construction time
    MyCustomization m_MyCustomizationInstance = new MyCustomization ();

    //* The following inner&private implementation class implements customization.
    class MyCustomization
    {
        MyCustomization ()
        {
            //* IMPLEMENT HERE WHATEVER YOU WANT TO EXECUTE DURING CONSTRUCTION TIME
        }
    }
}

这种方法有一些缺点(如一切):

    目前尚不清楚何时在AutogenCls类的整个构建过程中将完全执行MyCustomization内部类的构造函数.

    如果有必要为MyCustomization类实现IDiposable接口以正确处理MyCustomization类的非托管资源,我还不知道如何在不触及AutogenCls.cs文件的情况下触发MyCustomization.Dispose()方法......(但正如我告诉'还':)

但是这种方法与自动生成的代码有很大的区别 - 整个定制在不同的src代码文件中分开.

请享用 :)

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有