C#中动态订阅控件中任意事件的方法
2010-09-30 22:42:48 来源:WEB开发网要实现这样的功能,我们需要用到反射。首先,定义一个泛型方法,在这个方法里,我们直接对btnNext进行设置,如下:
1 protected void DoTrigger<T>(object sender, T eventArgs)
2 where T : System.EventArgs
3 {
4 this.btnNext.Enabled = true;
5 }
然后,根据用户给定的控件实例和事件名称,获得EventInfo对象。这个EventInfo里有个重要的属性,就是 EventHandlerType,它就是定义event所使用的委托类型。为了使开发人员指定的事件能够绑定到上面的DoTrigger函数上,我们需要知道那个EventArgs的具体类型,下面的代码可以将某个委托类型的所有参数类型全部读取出来:
01 private Type[] GetDelegateParameterTypes(Type d)
02 {
03 if (d.BaseType != typeof(MulticastDelegate))
04 {
05 throw new InvalidOperationException("Not a delegate.");
06 }
07
08 MethodInfo invoke = d.GetMethod("Invoke");
09 if (invoke == null)
10 {
11 throw new InvalidOperationException("Not a delegate.");
12 }
13
14 ParameterInfo[] parameters = invoke.GetParameters();
15 Type[] typeParameters = new Type[parameters.Length];
16 for (int i = 0; i < parameters.Length; i++)
17 {
18 typeParameters[i] = parameters[i].ParameterType;
19 }
20
21 return typeParameters;
22 }
更多精彩
赞助商链接