получение сведений о компоненте из другого класса завершается сбоем в c#

У меня есть winform с кнопкой и opendialog, вот мой код :

[Form1.цезий]:

    using System;
    using System.Windows.Forms;

    namespace WindowsFormsApplication4
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void button1_Click(object sender, EventArgs e)
            {
                Class1 obj=new Class1();
                obj.get_info(this);
            }
        }
    }

[class1.цезий]:

    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Reflection;
    using System.Windows.Forms;

    namespace WindowsFormsApplication4
    {
        class Class1
        {

            private IEnumerable<Component> EnumerateComponents(Form frm)
            {
                return from field in GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
                       where typeof(Component).IsAssignableFrom(field.FieldType)
                       let component = (Component)field.GetValue(frm)
                       where component != null
                       select component;
            }

            public void get_info(Form frm)
            {
                foreach (Component c in EnumerateComponents(frm))
                {
                    if (c.GetType() == typeof(OpenFileDialog))
                    {
                        MessageBox.Show("Detected OpenFileDialog");
                    }
                }
            }
        }
    }

почему это не работает ?

Я посетил эти ссылки ниже, но я не мог использовать их для решения моей проблемы :

Доступ к компоненту формы из другого класса
доступ к элементам управления формы из другого класса
доступ к визуальному компоненту из другой формы в c#

спасибо

1 ответ

  1. Вы спрашиваете неправильный тип, чтобы дать свой ответ. Вместо этого попросите frm.GetType():

    private IEnumerable<Component> EnumerateComponents(Form frm)
    {
        return from field in frm.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
            where typeof(Component).IsAssignableFrom(field.FieldType)
            let component = (Component)field.GetValue(frm)
            where component != null
            select component;
    }
    

    Он работал в Formкоде, потому что по своей сути, GetType()эквивалентенthis.GetType(), с этой формой.