2

如果我只向委托注册一个类的一个方法,我可以使用delegate.Target,但是当我从不同的类订阅更多方法时,这不再起作用。还有其他方法可以访问此代表的订阅者列表吗?

这是代码:foreach 循环在运行时被评估为 null(它编译)

    public delegate void WriteMessage(string msg);

internal class Program
{
    private static void Main(string[] args)
    {
        var myClass = new MyClass();
        var writer = new WriteMessage(myClass.WriteMessage);

        writer += SaySomething; //method in this class
        writer += myClass.SayShit; //instance class
        writer += AnotherClass.Say; //static class

        foreach(string target in (string[])writer.Target)
        {
            Console.WriteLine(target);
        }

        Console.ReadLine();
    }

    private static void SaySomething(string msg)
    {
        Console.WriteLine("HI!!!!");
    }
}

完整代码: http: //pastebin.com/AzzRGMY9

4

2 回答 2

4
Delegate[] list = delegate.GetInvocationList();

这将为您提供一个对象数组Delegate,您可以使用它来获取Targets 的列表。

于 2012-06-12T21:07:37.753 回答
0

这只是来自已接受答案的附加信息,因为我正在网上查找相同的信息。

如果要在接收到所有调用列表后调用所有注册的方法,可以使用以下代码:

 Delegate[] listAllRegisteredMethods = writer.GetInvocationList(); //writer is the variable based on the question example

        foreach(Delegate c in listAllRegisteredMethods )
        {
            object[] p = { }; //Insert your parameters here inside the array if your delegate has parameters
            c.DynamicInvoke(p); //Invoke it, if you have return values, assign it on a different variable
        }
于 2019-09-03T12:33:58.623 回答