众所周知 BeginInvoke既不属于Delegate类也不属于MulticastDelegate类 他是定义了一个具体的委托类型后再编译所生成的 现在我想写一个公共的方法 传入一个Delegate类型和一些参数 然后调用这个类型的BeginInvoke 具体如下:
public static object[] FireEvent(Delegate del, params object[] args) { List<object> list = new List<object>(); if (del != null) { Delegate[] del_list = del.GetInvocationList(); foreach (var item in del_list) { try { (item as 具体委托类型).BeginInvoke(null, null); } catch (Exception e) { Console.WriteLine(e.Message); } } } return list.ToArray(); }
可是我这个 “具体委托类型” 是不确定的 应该怎么办呢? 诚恳邀请各位大牛解答 !先谢谢了!
同步的话 直接DynamicInvoke
foreach (var item in del_list) { try { item.DynamicInvoke(args); //item.DynamicInvoke(); } catch (Exception e) { Console.WriteLine(e.Message); } }
异步的话,就要用具体的委托了,声明一个具体委托,再把你的委托传入,再调用DynamicInvoke
public static object[] FireEvent(Delegate del, params object[] args) { List<object> list = new List<object>(); //具体委托 Func<Delegate, object[], object> executeHandler = (dl, arg) => { return dl.DynamicInvoke(args); }; if (del != null) { Delegate[] del_list = del.GetInvocationList(); foreach (var item in del_list) { try { executeHandler.BeginInvoke(item, args, null, null); } catch (Exception e) { Console.WriteLine(e.Message); } } } return list.ToArray(); }
目前来说 我还没看懂这段代码 不过我想你应该是对的 谢谢啦!
可以用反射,试试看。
item.Method.Invoke(item.Target, null);