查找非 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;
知道如何解决这个问题吗?
【问题讨论】:
你有任何证据表明所有这些实际上共享一个基类吗?我不认为他们这样做。您可以将它们拖到表单的“非可视”区域这一事实只是一种花哨的抽象。 @BradleyDotNETDo 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# 组件的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual C# 中获取 Components 类以在面板中放置图像
错误记录Visual Studio 2019 中运行 Unity C# 脚本时报错 ( 根据解决方案, 可能需要安装额外的组件才能获得 | .NET 桌面开发 | 使用 Unity 的游戏开发 )
visual studio2010中C#生成的,ArcGIS二次开发的basetool的dll,注册为COM组件tlb文件,并在arcmap中加载使用