gpt4 book ai didi

c# - 是否可以在一个地方保留一个开放泛型类型的列表?

转载 作者:太空狗 更新时间:2023-10-30 00:40:59 25 4
gpt4 key购买 nike

我正在尝试拥有一个开放通用类型的 List。是否有可能有类似的东西:

public class MessageProcessor
{
private IDictionary<Type, IMessageHandler<>> _messageHandlers
= new Dictionary<Type, IMessageHandler<>>();

public void AddHandler<TMessage>(IMessageHandler<TMessage> handler)
{
var messageType = typeof(TMessage);
// Add to dictionary here
}

public void Handle<TMessage>(TMessage message)
{
// Call the correct handler here.
}
}

IMessageHandler 应该有一个强类型方法:

public void Handle(TMessage message) {}

我的真实例子有点复杂,所以我希望我在这里正确地简化了它。

事实上,我对每个处理程序的泛型类型不感兴趣。我只需要将它们全部放在一个地方,并且我可以轻松找到正确的处理程序,如果我可以在那个地方找到它们。

私有(private)字典将消息的类型 (TMessage) 作为键。所以我希望能够做到:

// ByteArrayHandler implements IMessageHandler<byte[]>
x.AddHandler(new ByteArrayHandler())
// StringHandler implements IMessageHandler<string>
x.AddHandler(new StringHandler())

x.Handle("Some message");
x.Handle(new byte[] { 1, 2, 3} );

并让 MessageProcessor 调用正确的 MessageHandler

最佳答案

每个人都知道扩展方法。但是“扩展字段”呢?当然不可能用一些新字段扩展一些对象,但是......你见过ConditionalWeakTable吗?类(class)?使用它我们可以将一些数据附加/关联到现有对象。很酷的功能是我们不需要明确地从该字典中删除项目。对象存储为弱引用,因此当 GC 收集键时,键值对会自动删除。使用它我们可以发明这个棘手的解决方案:

public class MessageProcessor
{
private static class MessageHandlerHolder<TMessage>
{
public static readonly ConditionalWeakTable<MessageProcessor, IMessageHandler<TMessage>> MessageHandlers =
new ConditionalWeakTable<MessageProcessor, IMessageHandler<TMessage>>();
}

public void AddHandler<TMessage>(IMessageHandler<TMessage> handler)
{
MessageHandlerHolder<TMessage>.MessageHandlers.Add(this, handler);
}

public void Handle<TMessage>(TMessage message)
{
IMessageHandler<TMessage> handler;
if (!MessageHandlerHolder<TMessage>.MessageHandlers.TryGetValue(this, out handler))
throw new InvalidOperationException("...");
handler.Handle(message);
}
}

所以一切都是强静态类型的,客户端不需要显式删除处理程序来避免内存泄漏。

关于c# - 是否可以在一个地方保留一个开放泛型类型的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23698553/

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