2011-07-15 16 views
0

我正在使用Visual Studio编码UI测试,并希望对生成的代码进行调整。如何在自动生成的C#部分类中对现有方法进行调整?

的代码被作为UIMap.csUIMap.Designer.cs局部类生成,所以我知道一个解决方案是创建具有稍微不同名称的方法,如myMethod_persistUIMap.csUIMap.Designer.cs使用该代替myMethod,这将在每次源重新生成时被覆盖。

然而这看起来很乱,所以我更喜欢的是改为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); }; 
} 

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

回答

0

如果您无法控制自动生成本身(即框架或第三方生成器),则您的选项有所限制。想到的两种方法是修改生成的代码 - 正如您所指出的那样,对于显着且可能随着时间推移而积累的更改是不切实际的 - 并且/或者创建派生类并使用它来代替使用auto - 生成的类直接(假设您控制将使用它们的代码,这似乎很可能)。

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

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

补充:当然,你还可以将新成员为同一分部类自己永久的文件添加到原生成的类,并且这些代码都可以访问类的私有成员。这可以是让派生类访问私有成员的另一种方式,例如通过创建一个受保护的属性来包装对私有成员字段的访问权限。如果您不需要更改现有的方法,则您不一定需要创建派生类,但您的示例提到想要从自动生成的代码中“覆盖”方法,因此推测它们已经存在于此处。

还要注意设计师文件 - 如窗体或用户控件 - 不usally得到完全覆盖,所以谨慎的变化核外生成的代码(例如,不里面的“Windows窗体设计器生成的代码“区域)可以被制作(并且被持久化)。例如,有时需要在Designer文件的Dispose(...)方法中添加对自定义清理方法的调用。

1

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

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

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

相关问题