如何对自动生成的C#partial类中的现有方法进行调整?

时间:2011-07-15 16:44:58

标签: c# code-generation override partial sealed

我正在使用Visual Studio Coded UI Tests,并希望坚持对生成的代码进行调整。

代码在UIMap.csUIMap.Designer.cs中生成为部分类,因此我知道一种解决方案是创建一个名称略有不同的方法,例如myMethod_persist in UIMap.cs并在myMethod中使用此代替UIMap.Designer.cs,每次重新生成源时都会覆盖myMethod

然而,这似乎非常混乱,所以我更喜欢在UIMap.cs覆盖myMethod。通过这种方式,界面不会很复杂,并且我不必记得在调用代码时将myMethod_persist的每个实例都更改为[UIMap.Designer.cs] partial class myClass { public override void myMethod( int a ){ somethingHorrible(int a); }; } [UIMap.cs] partial class myClass { public sealed override void myMethod( int a ){ somethingNice(int a); }; }

不幸的是,谈到C#我有点像菜鸟,甚至不知道这是否可行。

基本上我想要的是:

{{1}}

但是我知道sealed和override关键字通常用于派生的子类类,而不是部分类。这可能吗?如果不是那么什么是我最好的选择呢?

2 个答案:

答案 0 :(得分:1)

这里只有一个课 - myClass。 partial关键字只允许将类定义拆分为多个文件。

您可以使用部分方法,但前提是原始(生成)方法使用partial关键字。你不能覆盖同一个类的方法。

请参阅Partial Classes and Methods (C# Programming Guide)

答案 1 :(得分:0)

如果您无法控制自动生成本身(即框架或第三方生成器),您的选择会受到一些限制。我想到的两种方法是修改生成的代码 - 正如您所指出的那样,对于那些重要且可能随时间累积的更改而言并不实用 - 和/或创建派生类并使用它而不是使用auto直接生成的类(假设您控制将使用它们的代码,这似乎很可能)。

派生类(继承自动生成的类)将能够在要替换的方法声明中使用override或new。但是,这种方法也有很多警告。您只能“覆盖”在基类中被定义为虚拟的方法(或者本身是另一个底层虚拟基础的覆盖等)。您也可以在派生类中使用“new”替换方法,但基类中的其他代码将不知道您的“新”版本并且不会调用它(而他们将调用您的“覆盖”,因为它们知道方法是虚拟的)。还存在可访问性问题;您的派生类将无法访问基类的私有成员。

但是对于你想做的一些事情,它可以起作用。在某些情况下,您可能需要稍微调整自动生成的代码,例如添加关键字“virtual”或将“private”成员更改为“protected”,以便您可以从派生类访问它们。

已添加:当然,您也可以在自己的永久文件中为同一个分类添加新成员到原始生成的类,并且此代码可以访问该类的私有成员。这可以是让派生类访问私有成员的另一种方法,例如通过创建受保护的属性来包装对私有成员字段的访问。如果您不需要对现有方法进行更改,则不一定需要创建派生类,但您的示例谈到了要从自动生成的代码中“覆盖”方法,因此大概他们已经在那里存在了。

另请注意, Designer 文件(例如Form或UserControl)通常不会被完全覆盖,因此在核心生成的代码之外小心地更改 (例如,不在“Windows窗体设计器生成的代码”区域内“可以制作(并且是持久的)。例如,有时需要在Designer文件的Dispose(...)方法中添加对自定义清理方法的调用。