c# - 如何检查动态创建的winform实例是否已经在c#中打开
问题描述
我知道如何检查表格是否已经打开。但是,如果表单是动态创建的,我很难找到相同的。如何找到动态对象的类型?在下面的代码中,我试图找出 Application.OpenForms.OfType< ???
>().Any() 中的内容。我确信这很愚蠢,但我无法破解它。
public static bool OpenForm(string formName)
{
try
{
string namespace = MethodInfo.GetCurrentMethod().ReflectedType.Namespace;
Assembly assembly = Assembly.GetExecutingAssembly();
var _form = assembly.CreateInstance($"{namespace}.{formName}") as Form;
if (Application.OpenForms.OfType<???>().Any())
{
//Form is already open, do nothing
return true;
}
if (_form != null)
_form.Show();
return true;
}
catch (Exception ex)
{
return false;
}
}
解决方案
如果您打算使用泛型方法来验证 Form 类型的实例是否存在,如果不存在,则运行它,您可以使用泛型方法并执行检查和创建实例:
检查该类型的实例是否存在:
Application.OpenForms.OfType<T>()
如果尚未创建该类型,则创建实例并显示表单:
public static bool OpenForm<T>() where T : Form, new()
{
if (Application.OpenForms.OfType<T>().Any()) return true;
try {
var f = new T();
f.Show();
return true;
}
catch (Exception) {
return false;
}
}
由于您在代码片段中传递了 Form 的名称,因此您可以改为检查具有该名称的 Form 实例是否已经存在:
Application.OpenForms.OfType<Form>().Any(f => f.Name.Equals(formName))
如果没有,首先检查程序集是否实际上包含具有该名称的类型(如果找不到匹配项,则传递
true
, 导致抛出,因此它转到相同的异常处理程序):GetType()
var formType = assembly.GetType(formAsmName, true);
否则,它将继续并创建实例。
下次您尝试使用该名称创建 Form 的实例时,第一次检查将返回true
并且不会创建新实例。
public static bool OpenForm(string formName)
{
if (Application.OpenForms.OfType<Form>().Any(f => f.Name.Equals(formName))) return true;
try {
var assembly = Assembly.GetExecutingAssembly();
var formAsmName = $"{assembly.GetName().Name}.{formName}";
var formType = assembly.GetType(formAsmName, true); // <- Throws
var form = assembly.CreateInstance(formType.FullName) as Form;
form.Show();
return true;
}
catch (Exception) {
// Throw a specific exception instead?
return false;
}
}
推荐阅读
- javascript - 将 ES6 模块与 RequireJS 一起使用
- java - Maven 导入问题,在编译时里程碑版本正在使用,但在运行时最新的 RELEASE 版本正在使用
- android - 远程更改 recyclerView firebase 实时数据库中的视图类型
- php - 如何在 Spatie Laravel 备份中仅保存 5 个最近的备份?
- c++ - cplex c ++中的集合、子集和索引
- reactjs - Expo:React Native 仅在手机上引发 JSON 解析错误
- c - 退出程序时出现 free() 错误和 munmap_chunk 错误
- sql - 如何在不检查外键约束的情况下删除
- laravel - 如何将两个数组值从最低到最高排序并存储在数据库中
- javascript - 浏览器后退按钮事件不起作用jquery