在C#中获取Control的所有事件

时间:2015-04-12 04:26:02

标签: c# winforms events reflection

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

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);  
}

那我在这里错过了什么?怎么绕过这个?

1 个答案:

答案 0 :(得分:2)

致电时

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

返回System.RuntimeType

而当你明确地呼叫typeof(DataGridView)时,它会生成它的完整程序集限定名称。

我找到的一个解决方法是使用动态关键字

这里是

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

        }