你如何知道一个控件是否来自一个类

时间:2009-03-27 08:28:46

标签: c#

我有一个控件列表(_controlList),从那个控件列表中我想得到从给定类派生的控件。所以我的代码看起来像这样。

List<Control> _controlList = new List<Control>();

public Control[] ControlsThatIsA(Type soughtType)
{
  List<Control> result = new List<Control>();
  foreach (Control control in _controlList)
  {
// This would have been nice but doesn't compile
//////////////
//  if (control.GetType() is soughtType)
    {
      result.Add(control);
    }
  }
return result.ToArray();
}

任何想法。我没有传入Type,它可能是类的字符串名称

3 个答案:

答案 0 :(得分:5)

首先,我可能会使用泛型:

public T[] ControlsOfType<T>() where T : Control
{
  List<T> result = new List<T>();
  foreach (Control control in _controlList)
  {
    if (control is T)
    {
      result.Add((T)control);
    }
  }
  return result.ToArray();
}

或者在.NET 3.5中:

return _controlList.OfType<T>().ToArray();

如果您需要使用Type,那么IsAssignableFrom就是您的朋友,特别是:

if(soughtType.IsAssignableFrom(control.GetType())) {
   //...
}

答案 1 :(得分:1)

C#运算符已经进行了类型测试(比如Vb TypeOf运算符),因此它需要类似于 if(控制是MyNamespace.MyControl)
如果您在编译时知道要查找的类型,这很好,但对您的情况没有好处。 另外,如果您的测试被更改为参考等于测试(对不起,我真的是VB程序员,VB操作符将是IS但我不知道c#one)那么您的测试只会返回true如果控件是测试的类型,而不是它从seekType继承 尝试
control.GetType()。IsSubClassOf(seekType)

请注意,如果控件是seekType之一,IsSubClassOf将不会返回true,但您的问题确实要求仅查找从seekType继承的控件。

答案 2 :(得分:-1)

if( control is soughtType )
{
}