【问题标题】:Find Components Non Visual C#查找非 Visual C# 组件
【发布时间】:2015-01-17 12:48:30
【问题描述】:

我尝试了许多方法来列出表单的所有非可视组件,例如 OpenDialog、ImageList、TableAdapters 等,但找不到任何东西。为了找到屏幕控件,我在“控件”屏幕中使用 Foreach 进行了管理,但对于那些非可视组件,我什么也没找到。我使用了下面的代码但没有成功:

private IEnumerable<Component> EnumerateComponents()
{
    return from field in GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
           where typeof (Component).IsAssignableFrom(field.FieldType)
           let component = (Component) field.GetValue(this)
           where component != null
           select component;
}

知道如何解决这个问题吗?

【问题讨论】:

  • 你有任何证据表明所有这些实际上共享一个基类吗?我不认为他们这样做。您可以将它们拖到表单的“非可视”区域这一事实只是一种花哨的抽象。
  • @BradleyDotNET Do you have any evidence that all those actually share a base class? 我认为 OP 有。他们都共享Component基类
  • @L.B 即使这样; OP 并没有说明他的代码中有什么不起作用(因此我的假设)。

标签: c# winforms


【解决方案1】:
private IEnumerable<Component> EnumerateComponents()
{
    return this.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
           .Where(f => typeof(Component).IsAssignableFrom(f.FieldType))
           .Where(f => !typeof(Control).IsAssignableFrom(f.FieldType))
           .Select(f => f.GetValue(this))
           .OfType<Component>();
}

【讨论】:

  • 注意:这可能仅适用于那些将表单设计器的 Generate Member 选项设置为 true 的组件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2020-03-21
  • 2010-12-20
  • 1970-01-01
  • 2018-05-29
  • 2011-08-23
  • 1970-01-01
相关资源
最近更新 更多