【问题标题】:Get text property of all forms in an assembly via reflection通过反射获取程序集中所有表单的文本属性
【发布时间】:2017-03-20 10:10:31
【问题描述】:

我正在尝试遍历解决方案中的所有程序集,获取所有表单并检索每个表单的文本属性,但我真的不知道如何获取值。这是我的代码:

 Type formType = typeof(Form);

 var assemblies =
            AppDomain.CurrentDomain.GetAssemblies();

 foreach (var assembly in assemblies)
 {
    var types = assembly.GetTypes();

    foreach (var type in types)
    {
       if (formType.IsAssignableFrom(type))
       {
          var properties = type.GetProperties().Where(x => x.Name == "Text");
       }
    }
 }

我无法检索表单文本属性的具体值。我也 试过了

var property = type.GetProperty("Text").GetValue(???, null);

但不知道如何获取当前课程。有任何想法吗?谢谢!

编辑:我也试过

var frm = (Form)Activator.CreateInstance(type)

但如果表单没有无参数构造函数,这将失败。

【问题讨论】:

    标签: c# winforms reflection .net-assembly


    【解决方案1】:

    您可以尝试迭代 Application.OpenForms 集合。这将为您提供应用程序拥有的所有打开的表单。 MSDN

    【讨论】:

    • 我不需要打开的表格。我需要解决方案中的所有表单并获取显示表单名称的 Text 属性
    • 那么您必须遵循@sulo 的建议并使用(例如)某种静态参考列表来保存所有表单实例。
    • 但是为什么呢?我需要编写一个测试,在其中检查解决方案中的所有表单并阅读它们的 .Text 属性。这将在稍后与正则表达式进行匹配,以检查表单的文本是否设置正确。
    • 要访问 Text 属性,您需要创建一个类的实例。没有实例 --> 没有 Text 属性。因此,如果您正在编写测试用例,则使用 Activator.CreateInstance 是正确的。如果您不想或无法创建无参数构造函数,您可以尝试Activator.CreateInstance(Type, Object[]) (msdn.microsoft.com/de-de/library/wcxyzt4d%28v=vs.110%29.aspx)
    • 但即使我创建了一个实例,我也无法获取 Text 属性的值。
    【解决方案2】:

    如果您只需要引用打开的表单,您可以使用Application.OpenForms
    否则,您需要列出所有表单引用。

    【讨论】:

      猜你喜欢
      • 2020-08-24
      • 2014-08-27
      • 2023-04-04
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多