gpt4 book ai didi

c# - 计算来自单独类别的发布者的订阅者数量?如何从不同的类中获取对 Handler 的 InvocationList 的引用?

转载 作者:行者123 更新时间:2023-11-30 17:41:13 25 4
gpt4 key购买 nike

我有一个 C# 项目,其中有许多事件。因此,有许多发布者和订阅者订阅了该事件。我想要的是记录每个发布者的订阅者数量。

为简单起见,我在这里创建了一个基本场景。在此示例中,我想计算 EventsCounter 类中每个发布者的订阅者数量。我在这里有很多问题。

  1. 是否可以知道项目中有多少事件,或者我是否必须在 Class EventsCounter 中手动列出它们?
  2. 如何在每个事件中获取对处理程序的引用?
  3. 有什么方法可以更有效地做到这一点?

在这里,我可以使用 InvocationList 但我无法引用来自不同类的处理程序。例如Publisher.Foo 给我一个错误。

    using System;

namespace EventTest
{
class Program
{
static void Main(string[] args)
{
GenerateEvents ge = new GenerateEvents();
}
}

public class EventsCounter
{
//need to count all events and corresponding subscribers here
}

public class GenerateEvents
{
public GenerateEvents()
{
Publisher publisher = new Publisher();
Subscriber subscriber1 = new Subscriber();
Subscriber subscriber2 = new Subscriber();

publisher.Foo += subscriber1.FooHandler;
publisher.Foo += subscriber2.FooHandler;
publisher.RaiseFoo();

publisher.Foo -= subscriber1.FooHandler;
publisher.Foo -= subscriber2.FooHandler;
publisher.RaiseFoo();

Console.Read();
}
}

public class Publisher
{
public event EventHandler Foo;
int count = 0;

public void RaiseFoo()
{
Console.WriteLine("Raising Foo");
EventHandler handler = Foo;

if (handler != null)
{
foreach (EventHandler subscriber in handler.GetInvocationList())
{
count++;
subscriber(this, EventArgs.Empty);
}
Console.WriteLine("The count is {0}", count);
}
else
{
Console.WriteLine("No subscribers!");
}
}
}

public class Subscriber
{
public void FooHandler(object sender, EventArgs e)
{
Console.WriteLine("Subscriber Called");
}
}
}

最佳答案

您可以声明一个事件类型的属性。这样,您就可以跟踪对事件的订阅和移除。
此外,您可以通过调用事件的 GetInvocationList() 方法来枚举订阅的处理程序。我在发布者的 EnumerateSubscribers() 方法中对此进行了演示。
下面的代码是一个演示:

using System;

namespace MyApp
{
class Program
{
static void Main(string[] args)
{
var p = new Publisher();
var s1 = new Subscriber("first");
s1.Subscribe(p);
p.RaiseFoo(null, null);
var s2 = new Subscriber("second");
s2.Subscribe(p);
p.RaiseFoo(null, null);
p.EnumerateSubscribers();
s1.Unsubscribe(p);
p.RaiseFoo(null, null);
s2.Unsubscribe(p);
Console.ReadKey();
}
}

public class Subscriber
{
public string Name { get; set; }

public Subscriber(string name)
{
this.Name = name;
}

public void Subscribe(Publisher p)
{
p.Foo += this.HandleFoo;
}

public void Unsubscribe(Publisher p)
{
p.Foo -= this.HandleFoo;
}

private void HandleFoo(object sender, EventArgs e)
{
Console.WriteLine(this.Name + " is called");
}

public override string ToString()
{
return this.Name;
}
}

public class Publisher
{
private int count;
private EventHandler _foo;

public void RaiseFoo(object sender, EventArgs e)
{
if (_foo != null)
{
_foo(sender, e);
}
}

public void EnumerateSubscribers()
{
if (_foo != null)
{
foreach (var item in _foo.GetInvocationList())
{
Console.WriteLine("Subscriber object:" + item.Target?.ToString());
}
}
}

public event EventHandler Foo
{
add
{
_foo += value;
Console.WriteLine("Count:" + ++count);
}

remove
{
_foo -= value;
Console.WriteLine("Count:" + --count);
}
}
}


}

关于c# - 计算来自单独类别的发布者的订阅者数量?如何从不同的类中获取对 Handler 的 InvocationList 的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33354215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com