我不认为这是可能的,但如果是,那么我需要它:)
我有一个由Visual Studio2008从wsdl.exe命令行工具自动生成的代理文件。
代理输出是分部类。我想覆盖生成的默认构造函数。我不想修改代码,因为它是自动生成的。
我尝试创建另一个分部类并重新定义默认构造函数,但不起作用。然后,我尝试使用override和new关键字,但这不起作用。
我知道我可以从分部类继承,但这意味着我必须更改所有的源代码以指向新的父类。我不想这样做。
有什么想法、变通方法或技巧吗?
//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...
}
}
}
发布于 2008-10-29 10:08:01
这是不可能的。分部类本质上是同一个类的一部分;任何方法都不能定义两次或被覆盖,这包括构造函数。
您可以在构造函数中调用一个方法,并且只在另一个部分文件中实现它。
发布于 2010-01-09 01:24:53
我也遇到过类似的问题,我生成的代码是由DBML文件创建的(我使用的是Linq-to-SQL类)。
在生成的类中,它在构造函数的末尾调用一个称为OnCreated()的局部空函数。
长话短说,如果你想保留生成的类为你做的重要的构造函数内容(你可能应该这样做),那么在你的分部类中创建以下内容:
partial void OnCreated()
{
// Do the extra stuff here;
}
发布于 2010-04-02 20:57:24
嗯,我认为一个优雅的解决方案是:
//* 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
}
}
}
这种方法有一些缺点(就像所有的东西一样):
但是这种方法提供了与自动生成代码的很好的分离-整个定制被分离在不同的src代码文件中。
享受:)
https://stackoverflow.com/questions/247800
复制