C# 这是使用泛型方法的好方法吗?
以下是我的代码C# 这是使用泛型方法的好方法吗?,c#,generics,methods,C#,Generics,Methods,以下是我的代码 public class baseMenuItem : MenuItem { public baseMenuItem() { this.Click += baseMenuItem_Click; } void baseMenuItem_Click(object sender, RoutedEventArgs e) { //When user click the menu, I will nee
public class baseMenuItem : MenuItem
{
public baseMenuItem()
{
this.Click += baseMenuItem_Click;
}
void baseMenuItem_Click(object sender, RoutedEventArgs e)
{
//When user click the menu, I will need to new a window which type is assigned from AssignHandleWindow<T>()
}
public void AssignHandleWindow<T>() where T : baseWindow
{
//Can I save <T> into somewhere for later Click-event using?
//How do I do that?
}
}
公共类baseMenuItem:MenuItem
{
公共baseMenuItem()
{
此选项。单击+=baseMenuItem\u单击;
}
void baseMenuItem\u单击(对象发送方,路由目标)
{
//当用户单击菜单时,我需要新建一个窗口,该窗口的类型是从AssignHandleWindow()分配的
}
public void AssignHandleWindow(),其中T:baseWindow
{
//我可以保存到某个地方,以便以后使用单击事件吗?
//我该怎么做?
}
}
我不确定这是否可行,但我的应用程序中可能会有40个甚至更多的菜单项,我不想为每个菜单项编写单击事件来打开窗口,知道吗
谢谢。在这里,反射可能是一个更好的选择。可以通过控件()上的Tag属性将自定义数据与控件关联。可以将要打开的窗口的完全限定类型名称指定给标记(通过设计器或代码)。通过代码,它看起来像这样:
menuItem.Tag = "namespace.class, dllname";
然后在通用事件处理程序中执行以下操作(我的Win表单有点生疏,但它应该能让您了解需要执行的操作):
通常,这一未经测试的序言适用。public T AssignHandleWindow(),其中T:baseWindow,new()
public T AssignHandleWindow<T>() where T : baseWindow, new()
{
var window = new T();
return window;
}
{
var window=newt();
返回窗口;
}
上述方法行得通吗
然后您可以从单击处理程序调用它。我最近用
var thingsForMenu = getThingsForMenuBasedOnWhasClickedOn();
foreach(var v in thingsForMenu) {
ToolStripItem ti = new ToolStripMenuItem(v.key);
var localItem c = v.value;
ti.onClick += (o,ie) => {
doTheThing(c);
}
ToolStrip.DropDownItems.Add(ti);
}
注意:c的局部变量副本非常重要,因为v在循环中被重新赋值,您需要将指针传递给c in,而不仅仅是函数返回后内存中保存的v.value(通常导致所有菜单项调用相同的东西)
这不是对您的问题的“如何使用泛型”答案,但它提供了一种机制,可以将信息传递到onClick处理程序中。您可以在字段中保存类型,然后像这样使用
public class baseMenuItem : MenuItem
{
Type windowType;
public baseMenuItem()
{
this.Click += baseMenuItem_Click;
}
void baseMenuItem_Click(object sender, RoutedEventArgs e)
{
if(windowType != null){
window = (Control)Activator.CreateInstance(windowType);
window.Show();
}
}
public void AssignHandleWindow<T>() where T : baseWindow
{
windowType = typeof(T);
}
}
公共类baseMenuItem:MenuItem
{
类型窗口类型;
公共baseMenuItem()
{
此选项。单击+=baseMenuItem\u单击;
}
void baseMenuItem\u单击(对象发送方,路由目标)
{
if(windowType!=null){
window=(控件)Activator.CreateInstance(windowType);
window.Show();
}
}
public void AssignHandleWindow(),其中T:baseWindow
{
windowType=typeof(T);
}
}
您能提供它必须如何工作的示例吗?当用户单击菜单时,我需要新建一个窗口
,这意味着您已经知道要显示哪个窗口。所以,这看起来像是继承问题。这也是一个很好的解决方案,我尝试过了,它很有效,我真的想把它标记为答案,但是这个网站似乎不允许我这么做(标记2答案),谢谢。
public class baseMenuItem : MenuItem
{
Type windowType;
public baseMenuItem()
{
this.Click += baseMenuItem_Click;
}
void baseMenuItem_Click(object sender, RoutedEventArgs e)
{
if(windowType != null){
window = (Control)Activator.CreateInstance(windowType);
window.Show();
}
}
public void AssignHandleWindow<T>() where T : baseWindow
{
windowType = typeof(T);
}
}