0

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

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

然而,这似乎很混乱,所以我更喜欢的是myMethodUIMap.cs. 这样界面就不会很复杂,有很多口香糖,而且我不必记住将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 关键字通常用于派生子类类,而不是部分类。这可能吗?如果不是,那么我最好的选择是什么?

4

2 回答 2

1

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

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

请参阅部分类和方法(C# 编程指南)

于 2011-07-15T17:06:52.707 回答
0

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

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

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

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

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

于 2011-07-15T18:44:04.957 回答