查找非 Visual C# 组件

Posted

技术标签:

【中文标题】查找非 Visual C# 组件【英文标题】:Find Components Non 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 并没有说明他的代码中有什么不起作用(因此我的假设)。 【参考方案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 的组件。

以上是关于查找非 Visual C# 组件的主要内容,如果未能解决你的问题,请参考以下文章

如何查找包含特定类的 C# 组件

在 Visual C# 中获取 Components 类以在面板中放置图像

如何在 C# 中访问查找所有控件和所有组件到表单中?

如何在 C# 中访问查找所有控件和所有组件到表单中?

错误记录Visual Studio 2019 中运行 Unity C# 脚本时报错 ( 根据解决方案, 可能需要安装额外的组件才能获得 | .NET 桌面开发 | 使用 Unity 的游戏开发 )

visual studio2010中C#生成的,ArcGIS二次开发的basetool的dll,注册为COM组件tlb文件,并在arcmap中加载使用