C# 如何使用反射获取窗体的iwin32窗口

C# 如何使用反射获取窗体的iwin32窗口,c#,forms,reflection,.net-3.5,non-modal,C#,Forms,Reflection,.net 3.5,Non Modal,我有一个显示为非模式对话框的windows窗体。因此,我在该表单上调用重载的Show(iwin32windowowner)方法。唯一的问题是我想在这里使用的父窗体之一在项目中不可访问。因此,我希望使用下面的代码之类的反射来加载它 var frm = Assembly.GetEntryAssembly().GetTypes().Where(f => f.Name == "ParentForm").FirstOrDefault(); 但是,这会导致以下编译错误 匹配的最佳重载方法 'Syst

我有一个显示为非模式对话框的windows窗体。因此,我在该表单上调用重载的Show(iwin32windowowner)方法。唯一的问题是我想在这里使用的父窗体之一在项目中不可访问。因此,我希望使用下面的代码之类的反射来加载它

var frm = Assembly.GetEntryAssembly().GetTypes().Where(f => f.Name == "ParentForm").FirstOrDefault();
但是,这会导致以下编译错误

匹配的最佳重载方法

'System.Windows.Forms.Form.Show(System.Windows.Forms.IWin32Window)' 有一些无效的参数

参数1:无法从“System.Type”转换为 'System.Windows.Forms.IWin32Window'


关于如何实现这一点有什么建议吗?

您可能希望通过
应用程序.OpenForms
集合进行搜索

Form f = Application.OpenForms.Where(x => x.GetType().Name == "ParentForm").FirstOrDefault();

使用反射,您得到的是与
父窗体
对应的
类型
,而不是实际的
父窗体
实例。是否可以使用反射获取它?无法使用反射获取实例。它仅用于发现
类型
和相关属性,以获取确切的信息?它的现有实例,还是新实例?后者很简单,
Activator.CreateInstance(frm)
。对于前者,您需要知道如何获取对它的引用,它是自动完成的。@Tim:对于表单,它可以。这是个好主意。通过反射,我首先搜索该类型,然后在您提到的API的所有打开表单中查找该类型。问题解决了。。。你就是那个男人@保尔斯诺:我想我应该对集合中的每个表单调用
GetType()
,并检查名称。对于.NET来说,获取每种表单类型的名称比获取每种类型的名称和其他元数据的工作量要少一些。但很高兴你能成功。