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);
    }
}