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)
{
}
我正在尝试获取有关特定控件的所有事件信息。
为此,我写了一段代码,如果我对 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)
{
}