代码生成——如何在自动生成的c#分部类中对现有方法进行调整

本文关键字:有方法 调整 自动生成 代码生成 | 更新日期: 2023-09-27 18:02:17

我正在使用Visual Studio编码UI测试,并希望对生成的代码进行持续调整。

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

然而,这似乎非常混乱,所以我更喜欢的是,在UIMap.cs中重写myMethod。这样,接口就不会因为大量的内存而变得复杂,我也不必记得在调用代码时将myMethod的每个实例更改为myMethod_persist

不幸的是,当谈到c#时,我是一个新手,甚至不知道这是否可能。

基本上我想要的是:

[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); };
}

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

代码生成——如何在自动生成的c#分部类中对现有方法进行调整

这里只有一个类——myClass。partial关键字只允许将类定义拆分到多个文件中。

可以使用分部方法,但前提是原始(生成的)方法使用了分部关键字。不能在同一个类上重写方法。

参见部分类和方法(c#编程指南)

如果您无法控制自动生成本身(即:框架或第三方生成器)你的选择是有限的。我想到的两种方法是修改生成的代码——正如您所注意到的那样,对于重要的并且可能随着时间的推移而积累的更改来说,这是不实际的——和/或创建一个派生类并使用它,而不是直接使用自动生成的类(假设您控制了将使用它们的代码,这似乎是可能的)。

派生类(继承了自动生成的类)可以在想要替换的方法声明中使用override或new。然而,这种方法也有很多需要注意的地方。你只能"重写"一个在基类中被声明为虚的方法(或者它本身是另一个底层虚基的重写,等等)。您也可以用派生类中的"新"方法替换方法,但基类中的其他代码将不知道您的"新"版本,也不会调用它(然而,它们将调用您的"重写",因为它们知道该方法是虚拟的)。还有可访问性的问题;派生类不能访问基类的私有成员。

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

Added:当然,您也可以在您自己的永久文件中为相同的部分类的原始生成类添加新成员,并且该代码可以访问类的私有成员。这可能是另一种让派生类访问私有成员的方法,例如通过创建受保护的属性来包装对私有成员字段的访问。如果您不需要更改现有的方法,您就不一定需要创建派生类,但是您的示例谈到想要"覆盖"自动生成代码中的方法,因此假设它们已经存在。

还需要注意的是,Designer文件(例如Form或UserControl)通常不会被完全覆盖,因此在核心生成代码之外谨慎更改(例如:(不在"Windows窗体设计器生成的代码"区域内)可以创建(并持久化)。例如,有时需要在Designer文件中的Dispose(…)方法中添加对您自己的自定义清理方法的调用。