C# 使用相同的逻辑处理多个方法是否有共同的做法?
我有一个带按钮的简单菜单。每个按钮打开另一个窗体C# 使用相同的逻辑处理多个方法是否有共同的做法?,c#,methods,C#,Methods,我有一个带按钮的简单菜单。每个按钮打开另一个窗体 public void apartmentDetailsButton_Click(object sender, EventArgs e) { using (var form = new ApartmentDetails.View()) { form.ShowDialog(this); } } public void remindersButton_Click(object sender, EventArgs
public void apartmentDetailsButton_Click(object sender, EventArgs e)
{
using (var form = new ApartmentDetails.View())
{
form.ShowDialog(this);
}
}
public void remindersButton_Click(object sender, EventArgs e)
{
using (var form = new Reminders.View())
{
form.ShowDialog(this);
}
}
public void paymentsButton_Click(object sender, EventArgs e)
{
using (var form = new Payments.View())
{
form.ShowDialog(this);
}
}
public void documentsButton_Click(object sender, EventArgs e)
{
using (var form = new Documents.View())
{
form.ShowDialog(view);
}
}
如您所见,除了包含所需表单的名称空间之外,事件处理程序执行的操作基本相同。现在,如果我有更多的按钮呢?我真的应该每次都复制粘贴这个方法吗
是否可以对所有按钮使用一个eventhandler或泛化现有的处理程序?假设所有类型都实现或派生自一个公共类型,您可以声明如下方法:
public void DisplayForm(CommonType f)
{
using(var form = f.View())
{
form.ShowDialog(view);
}
}
把它叫做:
DisplayForm(new Documents());
CommonType
应该是包含View
方法的类型
为了减少事件处理程序的数量,您可以声明一个事件处理程序并检查发送方的类型
:
public void OnButtonClick(object sender, EventArgs e)
{
if(sender is ApartmentDetails)
{
DisplayForm(new ApartmentDetails());
}
...
}
假设所有类型都实现或派生自一个公共类型,则可以声明如下方法:
public void DisplayForm(CommonType f)
{
using(var form = f.View())
{
form.ShowDialog(view);
}
}
把它叫做:
DisplayForm(new Documents());
CommonType
应该是包含View
方法的类型
为了减少事件处理程序的数量,您可以声明一个事件处理程序并检查发送方的类型
:
public void OnButtonClick(object sender, EventArgs e)
{
if(sender is ApartmentDetails)
{
DisplayForm(new ApartmentDetails());
}
...
}
因为您的eventhandler处理不同的类型,所以无法为所有按钮创建一个eventhandler 解决方法之一是使用
Activator.CreateInstance
,但仅当所有表单都可以使用具有相同签名的构造函数创建时
public void OnClick(Type viewType, Form parent)
{
using (var form = (Form)Activator.CreateInstance(viewType))
{
form.ShowDialog(parent);
}
}
然后在构造函数中,将其用于所有按钮
apartmentDetailsButton.Click += (sender, args) => OnClick(typeof(ApartmentDetails.View), this);
remindersButton.Click += (sender, args) => OnClick(typeof(Reminders.View), this);
paymentsButton.Click += (sender, args) => OnClick(typeof(Payments.View), this);
您可以通过在按钮.Tag中保存所显示表单的类型来摆脱lambda
private void OnButtonClick(object sender, EventArgs args)
{
var button = (Button)sender;
var viewType = (Type)button.Tag;
using (var form = (Form)Activator.CreateInstance(viewType))
{
form.ShowDialog(this);
}
}
然后“订阅”活动
apartmentDetailsButton.Tag = typeof(ApartmentDetails.View);
apartmentDetailsButton.Click += OnButtonClick;
apartmentDetailsButton.Tag = typeof(Reminders.View);
remindersButton.Click += OnButtonClick;
因为您的eventhandler处理不同的类型,所以无法为所有按钮创建一个eventhandler
解决方法之一是使用Activator.CreateInstance
,但仅当所有表单都可以使用具有相同签名的构造函数创建时
public void OnClick(Type viewType, Form parent)
{
using (var form = (Form)Activator.CreateInstance(viewType))
{
form.ShowDialog(parent);
}
}
然后在构造函数中,将其用于所有按钮
apartmentDetailsButton.Click += (sender, args) => OnClick(typeof(ApartmentDetails.View), this);
remindersButton.Click += (sender, args) => OnClick(typeof(Reminders.View), this);
paymentsButton.Click += (sender, args) => OnClick(typeof(Payments.View), this);
您可以通过在按钮.Tag中保存所显示表单的类型来摆脱lambda
private void OnButtonClick(object sender, EventArgs args)
{
var button = (Button)sender;
var viewType = (Type)button.Tag;
using (var form = (Form)Activator.CreateInstance(viewType))
{
form.ShowDialog(this);
}
}
然后“订阅”活动
apartmentDetailsButton.Tag = typeof(ApartmentDetails.View);
apartmentDetailsButton.Click += OnButtonClick;
apartmentDetailsButton.Tag = typeof(Reminders.View);
remindersButton.Click += OnButtonClick;
一个事件方法可以处理多个按钮。只需更改使用“+=”注册事件的方法的名称。谢谢。我怎么知道要引用哪个名称空间?@Sipo:sender参数是对单击的按钮的引用-因此您可以通过使用标记或类似的东西来检查该参数以查看需要哪个名称空间。@PaulF-如果您使用的是Windows窗体项目,则代码通常位于designer.cs文件中。因此,您可以将代码从设计器移动到表单构造函数或加载方法中。然后将所有按钮的调用方法的命名更改为相同。您可以让一个事件方法处理多个按钮。只需更改使用“+=”注册事件的方法的名称。谢谢。我怎么知道要引用哪个名称空间?@Sipo:sender参数是对单击的按钮的引用-因此您可以通过使用标记或类似的东西来检查该参数以查看需要哪个名称空间。@PaulF-如果您使用的是Windows窗体项目,则代码通常位于designer.cs文件中。因此,您可以将代码从设计器移动到表单构造函数或加载方法中。然后将所有按钮的调用方法的命名更改为相同。即使使用通用方法,OP也需要为每个按钮创建自己的事件处理程序。为什么它需要是一个通用方法而不是public void DisplayForm(ICommonInterface f)
?@KMoussa您是对的,这也可以工作。我想,乍一看,这个场景似乎是我使用泛型的最佳场所:)@SelmanGenç,谢谢!所以我仍然需要为每个按钮编写一个事件处理程序?OP甚至不需要公共接口,因为他创建的对象都是从Form
派生的表单,即使使用通用方法,OP也需要为每个按钮创建自己的事件处理程序为什么它需要是通用方法而不是public void DisplayForm(icomonInterface f)
?@KMoussa你说得对,那也行。我想这个场景对我来说是一个使用泛型的完美地方:)@SelmanGenç,谢谢!所以我仍然需要为每个按钮编写一个事件处理程序?OP甚至不需要公共接口,因为他创建的对象都是从Form