gpt4 book ai didi

c# - 是否可以使用开放泛型作为构造函数参数?

转载 作者:太空狗 更新时间:2023-10-29 23:17:55 27 4
gpt4 key购买 nike

我创建了一个非常简单的事件发布器,它看起来像这样。

public class EventPublisher
{
private readonly IList<Func<IHandle>> _subscribers;

public EventPublisher(IList<Func<IHandle>> subscribers)
{
_subscribers = subscribers;
}

public void Publish<TPayload>(TPayload payload)
where TPayload : class
{
var payloadHandlers = _subscribers.OfType<Func<IHandle<TPayload>>>();

foreach (var payloadHandler in payloadHandlers)
{
payloadHandler().Handle(payload);
}
}
}

这是我必须发布的消息。

var subscribers = new List<Func<IHandle>> {() => new SomeHandler()};
var eventPublisher = new EventPublisher(subscribers);

eventPublisher.Publish(new SomeMessage { Text = "Some random text..." });

我遇到的问题是发布消息时找不到任何可以处理负载的处理程序。这是有道理的,因为我将订阅者注册为 Func<IHandle>而不是 Func<IHandle<T>> .

我的处理程序类继承的接口(interface)来自 Caliburn.Micro.EventAggregator,它看起来像这样。

public interface IHandle {}

public interface IHandle<TMessage> : IHandle {
void Handle(TMessage message);
}

_subscribers 的类型必须是什么?是处理IHandle<>通用类型可以是任何具体类型?

最佳答案

假设您使用的是 .NET 4,我希望它能工作:

var subscribers = new List<Func<IHandle<SomeMessage>>> {() => new SomeHandler()};

然后得到协方差:

public EventPublisher(IEnumerable<Func<IHandle>> subscribers)
{
_subscribers = subscribers.ToList();
}

这让您可以订阅与 Func<IHandle> 兼容的任何序列.请注意,它确实显着改变了语义,因为订阅者集将在构造后固定。就我个人而言,我认为这是一件好事,但它可能不适合你。

或者,EventPublisher本身必须与多种类型一起工作?你能做到吗EventPublisher<T>并使用 IHandle<T>无处不在,制作Publish非通用?这可能可行也可能不可行,具体取决于您希望如何使用它 - 两种选择都有意义。

关于c# - 是否可以使用开放泛型作为构造函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7093817/

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