c#按名称删除组件

本文关键字:删除 组件 | 更新日期: 2023-09-27 18:17:02

嗯,我正在创建一个能够根据其名称和类型从面板中删除组件的方法。我的代码是:

private void RemoveItemByName<T>(Panel panel, string name)
{
    foreach (T item in panel.Controls.OfType<T>().Where(item => item.Name == name))
        panel.Controls.Remove(item);
}

但是属性Name在类型T中不存在,因为T还没有定义。我想这样使用它:

RemoveItemByName<TextBox>(pnlMain, "txtPesquisa");
RemoveItemByName<Button>(pnlMain, "btnCloseSearch");

在这种情况下,编译器给我两个错误:Cannot resolve symbol 'Name' in itemArgument type 'T' is not assignable to parameter type 'System.Windows.Forms.Control'

当我尝试将T转换为可接受的类型时,它不允许我这样做。我怎样才能把这个转换成这样呢?

c#按名称删除组件

您必须给T一个约束,以便编译器知道类型上可用的方法和属性:

private void RemoveItemByName<T>(Panel panel, string name) 
  where T : System.Windows.Control
{
    foreach (T item in panel.Controls.OfType<T>().ToList().Where(
     item => item.Name == name))
          panel.Controls.Remove(item);
}

这将告诉编译器可以传递Control类型的任何对象(包括从它继承的对象)