gpt4 book ai didi

c# - 使用枚举值创建泛型类型

转载 作者:行者123 更新时间:2023-12-02 02:13:36 31 4
gpt4 key购买 nike

我希望能够使用枚举值创建新的泛型类型。我相信这可以通过 C++ 模板实现,但我不知道是否可以通过 C# 实现。

所以我想做的是:

public class MyClass <T>
{
public void Do<T>() {}
}

public enum Metals
{
Silver, Gold
}

我想传递一个枚举,例如:

var myGoldClass = new MyClass<Metals.Gold>();

我想我可以创建名为 Gold、Silver 的类来实现此目的,但我非常喜欢使用枚举来约束泛型类的类型。

我在现实世界中想要这样的东西的原因是我正在创建一个事件聚合器(发布-订阅模型)并且我希望我的订阅者订阅某种类型 T 的消息。所以我认为它如果我可以让我的订阅者使用枚举进行订阅,那就太好了。

编辑:澄清一下,Metals.Gold 只是一个示例枚举。我希望客户端库创建自己的枚举\类并使用它。我自己没有定义枚举。

最佳答案

无法使用枚举值作为通用参数。在这种情况下,您可能应该使用继承:

public abstract class Metal
{
protected Metals MetalType { get; private set; }

protected Metal(Metals metal)
{
MetalType = metal;
}
}

public class Gold : Metal
{
public Gold() : base(Metals.Gold)
{
}
}

更进一步,关于 PubSub 实现的问题部分太宽泛,因为需要考虑很多事情。这是一个示例,您可以从中得到一些有用的想法:

public class EventHub
{
// only one receiver per message type is allowed to simplify an example
private static readonly ConcurrentDictionary<MessageTypes, IReceiver> receivers =
new ConcurrentDictionary<MessageTypes, IReceiver>();

public bool TrySubscribe(MessageTypes messageType, IReceiver receiver)
{
return receivers.TryAdd(messageType, receiver);
}

public void Publish(IMessage message)
{
IReceiver receiver;

if (receivers.TryGetValue(message.MessageType, out receiver))
{
receiver.Receive(message);
}
}
}

public interface IMessage
{
MessageTypes MessageType { get; }
string Text { get; set; }
}

public interface IReceiver
{
void Receive(IMessage message);
}

关于c# - 使用枚举值创建泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36864168/

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