C#获取控件的所有事件

Getting all events of a Control in C#

我正在尝试获取有关特定控件的所有事件信息。
为此,我写了一段代码,如果我对 class 名称进行硬编码,它就可以工作,但是当我尝试使其动态化时,它会失败,也就是说它不会给出任何错误,而是事件集合变为空。
这是有效的代码:

AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += CurrentDomain_ReflectionOnlyAssemblyResolve;

var assembly = System.Reflection.Assembly.ReflectionOnlyLoadFrom(typeof(DataGridView).Module.FullyQualifiedName);
var events = Type.ReflectionOnlyGetType(typeof(DataGridView).AssemblyQualifiedName, false, true).GetEvents();

这是失败的对应部分:

AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += CurrentDomain_ReflectionOnlyAssemblyResolve;
var assembly = System.Reflection.Assembly.ReflectionOnlyLoadFrom(cmbox.SelectedItem.GetType().Module.FullyQualifiedName);
var events = Type.ReflectionOnlyGetType(cmbox.SelectedItem.GetType().AssemblyQualifiedName, false, true).GetEvents();

ComboBx 充满 windows 表单控件,如下所示:

var controlType = typeof(Control);
            var controls = controlType
                .Assembly
                .GetTypes()
                .Where(t => controlType.IsAssignableFrom(t) &&
                            t.Namespace == "System.Windows.Forms"
                );
            foreach (var control in controls)
            {
                cmbox.Items.Add(control);
            }

顺便说一句,这是事件处理程序的内容:

Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
      return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);  
}

那么我在这里缺少什么?如何解决这个问题?

当你打电话给

var events = Type.ReflectionOnlyGetType(cmbox.SelectedItem.GetType().AssemblyQualifiedName, 
             false, true).GetEvents();

它returnsSystem.RuntimeType

而当您显式调用 typeof(DataGridView) 时,它会生成完整的程序集限定名称。

我发现的一种解决方法是使用 dynamic 关键字

这里是

        dynamic controltype = cmbx.SelectedItem;
        var events = Type.ReflectionOnlyGetType(controltype.AssemblyQualifiedName, false, true).GetEvents();
        foreach (var item in events)
        {

        }