public delegate void test(); class Class1 { public event test testclick; public Class1() { testclick += A; testclick += B; } public void A(){} public void B(){} public static T GetEventHandler<T>(object classInstance, string eventName) { Type classType = classInstance.GetType(); FieldInfo eventField = classType.GetField(eventName, BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance); var eventDelegate = (T)eventField.GetValue(classInstance); return eventDelegate; } } public class TestClass { public object InvokeMethod(bool needrandom,params object[] p_Objects) { object result = null; var classs = new Class1(); var eventDelegate = Class1.GetEventHandler<test>(classs, "testclick"); var eventlist = eventDelegate.GetInvocationList(); if (needrandom) { var rd=new Random(); var index=rd.Next(0, eventlist.Length); result = eventlist[index].DynamicInvoke(p_Objects); } else { foreach (var eventMethod in eventlist) { result = eventMethod.DynamicInvoke(p_Objects); } } return result; } }
public delegate void test();
class Class1
{
public event test testclick;
public Class1()
{
testclick += A;
testclick += B;
}
public void A(){}
public void B(){}
public static T GetEventHandler<T>(object classInstance, string eventName)
{
Type classType = classInstance.GetType();
FieldInfo eventField = classType.GetField(eventName, BindingFlags.GetField
| BindingFlags.NonPublic
| BindingFlags.Instance);
var eventDelegate = (T)eventField.GetValue(classInstance);
return eventDelegate;
}
} public class TestClass
{
public object InvokeMethod(bool needrandom,params object[] p_Objects)
{
object result = null;
var classs = new Class1();
var eventDelegate = Class1.GetEventHandler<test>(classs, "testclick");
var eventlist = eventDelegate.GetInvocationList();
if (needrandom)
{
var rd=new Random();
var index=rd.Next(0, eventlist.Length);
result = eventlist[index].DynamicInvoke(p_Objects);
}
else
{
foreach (var eventMethod in eventlist)
{
result = eventMethod.DynamicInvoke(p_Objects);
}
}
return result;
}
}
(最后一个被委托的方法在真正执行的那个方法结束之前,必须被阻塞等待)不过话说回来,如果这不是无可奈何的事情,那就换个思路
为啥一定要用委托链来实现这种需求?为啥不能通过List<Func<>>加随机数的方式来实现你的需求?
p_Objects是一个可以传变长参数的参数组,
比如你要执行的方法是2个参数 (string id,int count)
就调用TestClass testclass=new TestClass();
testclass.InvokeMethod(true,id,count);
如果只是委托,你随便可离散调用它。例如对于public class TA
{
public delegate void ABC(string x, int b); public ABC abc; public void test()
{
if (abc != null)
abc(DateTime.Now.ToString(), DateTime.Now.Second);
}
}
你就可以这样调用var x = new TA();
x.abc += (p1, p2) =>
{
Console.WriteLine("rule1");
};
x.abc += (p1, p2) =>
{
Console.WriteLine("rule2");
};
x.abc += (p1, p2) =>
{
Console.WriteLine("rule3");
};
var array = x.abc.GetInvocationList();
((TA.ABC)array[2])("1213", 1);
((TA.ABC)array[0])("1213", 1);
这里按照3、1的次序调用它。其实这就是事件跟普通的委托的区别。如果你声明为public event ABC abc;那么就不允许在 TA 类型外部去散列 abc 委托了,你就只能在 TA 内部去实现。例如写public void test(int index)
{
var x = (ABC)abc.GetInvocationList()[index];
if (x != null)
x(DateTime.Now.ToString(), DateTime.Now.Second);
}