我继承了使用后台工作程序的应用程序。在整个应用程序过程中,为DoWork分配了多个功能,或从其中删除了多个功能(请参见下文)。是否有可以调用的属性或方法来评估当前分配给DoWork函数的方法,或者这是应用程序应该跟踪的东西吗?
例如:
worker.DoWork += method1;
{ Run some code }
worker.DoWork -= method1;
worker.DoWork += method2;
{ Run some code }
worker.DoWork -= method2;
答案 0 :(得分:-1)
您可以写一个custom event accessor。当然,由于它是自定义的,您最终需要自己进行跟踪,但是这是您可以执行的方法。
class MyClass
{
protected readonly List<EventHandler> list = new List<EventHandler>();
public event EventHandler DoWork
{
add
{
list.Add(value);
}
remove
{
list.Remove(value);
}
}
public void RaiseDoWork()
{
var args = new EventArgs();
foreach (var func in list)
{
func(this, args);
}
}
public IEnumerable<EventHandler> GetDoWorkDelegates()
{
return list;
}
}
public class Program
{
public static void HandleDoWork(object sender, EventArgs e)
{
Console.WriteLine("Event fired.");
}
public static void Main()
{
var c = new MyClass();
c.DoWork += HandleDoWork;
c.RaiseDoWork();
foreach (var d in c.GetDoWorkDelegates())
{
Console.WriteLine("Method name was {0}.", d.Method.Name);
}
}
}
输出:
Event fired.
Method name was HandleDoWork.
Working example on DotNetFiddle
注意:如果您希望以上内容是线程安全的,则需要更多代码。
答案 1 :(得分:-2)
使用事件而不是仅仅使用委托的全部目的是,它专门防止该类型外部的任何代码,而不执行除添加或删除处理程序之外的任何操作。您既不能调用也不能检查添加到事件中的所有处理程序。