C# 自动使所有子类调用父类的方法

C# 自动使所有子类调用父类的方法,c#,.net,inheritance,resharper,C#,.net,Inheritance,Resharper,我目前正在重构一个大型应用程序 有大量的Windows窗体,它们都继承自一个基本窗体。我无法调试在使用Application.Run运行第一个表单后发生的任何事情 由于代码乱七八糟,我无法在调试UI时轻松遵循流程,也不知道何时查看哪个表单 表单太多,我无法手动为每个表单创建一个方法,因此我要做的是在父类中创建一个方法,每个人都会调用该方法。例如,此方法可以将表单名称打印到控制台。通过这种方式,我可以在源代码中创建一些文件夹结构,基于什么导致哪里 有没有关于如何使用Resharper和/或Visu

我目前正在重构一个大型应用程序

有大量的Windows窗体,它们都继承自一个基本窗体。我无法调试在使用Application.Run运行第一个表单后发生的任何事情

由于代码乱七八糟,我无法在调试UI时轻松遵循流程,也不知道何时查看哪个表单

表单太多,我无法手动为每个表单创建一个方法,因此我要做的是在父类中创建一个方法,每个人都会调用该方法。例如,此方法可以将表单名称打印到控制台。通过这种方式,我可以在源代码中创建一些文件夹结构,基于什么导致哪里

有没有关于如何使用Resharper和/或VisualStudio实现这一点的建议


非常感谢您的任何意见

据我所知,正如您所说,如果所有表单都继承自一个基本表单,那么它们都有共同的组件。因此,您可以创建一个类似于bellow的模块,并将此基本表单的方法放入其中

'This Module you will put all methods from the base form

Module ProcAuxiliar

    Public Sub BaseForm_Sum (ByVal Textbox1 As String, ByVal Textbox2 As String)
        Dim Val1 As Int32 = Convert.ToInt32(Textbox1)
        Dim Val2 As Int32 = Convert.ToInt32(Textbox2)

        MsgBox( Convert.ToString(Val1 + Val2)

    End Sub

    Public Sub BaseForm_decrease (ByVal Textbox1 As String, ByVal Textbox2 As String)
        Dim Val1 As Int32 = Convert.ToInt32(Textbox1)
        Dim Val2 As Int32 = Convert.ToInt32(Textbox2)

        MsgBox( Convert.ToString(Val1 - Val2)

    End Sub

End Module  
在子窗体中,只需从模块调用该方法

'Child Form 1
    Sub BtSumClick(ByVal sender As Object, ByVal e As EventArgs) Handles btSum.Click
        ProcAuxiliar.BaseForm_Sum(Textbox1.Text, Textbox2.Text)
    End Sub

    'Child Form 2
    Sub BtDecreaseClick(ByVal sender As Object, ByVal e As EventArgs) Handles BtDecrease.Click
        ProcAuxiliar.BaseForm_decrease(Textbox1.Text, Textbox2.Text)
    End Sub
重写子级中的baseform方法并使用更多代码调用baseform方法:

protected override sub Children_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        MyBase.Children_Load(sender, e)


    MyBase.BaseForm_Load(sender, e)


End Sub

如果尚未重写OnShown方法,可以将其放在基本表单中,如下所示:

public /*abstract*/ class BaseForm : Form
{ 
    protected override void OnShown(EventArgs e)
    {
        base.OnShown(e);
        Console.WriteLine($"Entered {this.GetType().Name}");
    }
}

当显示任何表单时,将自动调用它,并使用反射将类的名称打印到控制台。

在基中创建方法相当简单:protected sealed void Callme{/*…yada yada*/},但何时何地调用它?这是个问题。子类太多,我无法复制并粘贴一个基本表单调用到每个子类。我需要一个自动化的函数或语法,这将迫使所有表单在输入时报告他们的名字。创建?显示。。。当然,您可以在基类构造函数中添加一些反射报告,每个子代都会自动调用它。。。但是我想你需要更多的东西,比如Form.Show什么时候被调用……或者完全不同:也许外部代码分析工具会有所帮助。有一些工具可以检测和可视化代码依赖关系。。。只是一个想法。当进入是一个很好的事件要考虑,谢谢!我已经在使用代码分析工具来可视化依赖关系。现在我想找出在用户界面的哪个部分使用了哪些源代码。例如,当我输入设置时,如果您已输入设置窗体,则应弹出该窗口。问题是表单太多,我无法为每个孩子手动创建。希望这能让你明白答案!如果我没有足够清楚地强调这个问题,我很抱歉。表单太多,我无法从所有子级手动调用该方法。因此,我正在寻找一种功能,它允许我创建一个基本表单方法,然后按下几个按钮或使用一些语法,强制所有子级调用它,而无需我花费数小时将调用复制到每个子级。让我看看我是否理解,如果子级表单处于打开状态,您希望在所有子级表单中调用一个方法,例如,在下午14点为所有打开的表单显示msgbox?关闭!假设我启动应用程序,它进入主菜单窗体。当你在主菜单中时,它会弹出。然后我按设置。它应该弹出你现在在设置窗体中,等等。有太多的表单让我无法为每个孩子手动实现,基本上,你必须使用一个基本表单,其他所有表单都从中继承,因为如果你在基本表单的方法OnEnter上实现welcome,它将在孩子中自动调用,你不需要在所有孩子中实现welcome。对于子窗体在基本窗体中自动调用方法,它必须在操作中,例如,onclick、onload、onclose。如果您想在子对象中添加更多代码,只需重写我在第一个回答中编辑的调用基方法的方法:是的,您是对的,这就是我想要的。我实现了Jakub Dąbek提供的代码,如果我理解正确,您的意思也是一样的。谢谢你的帮助。这非常有效!非常感谢,节省了我很多时间