gpt4 book ai didi

c# - 处理泛型

转载 作者:行者123 更新时间:2023-12-02 04:33:17 24 4
gpt4 key购买 nike

class Order { ... }

class OrderA : Order { ... }

class OrderB : Order { ... }

class OrderC : Order { ... }

class OrderD : Order { ... }


private Order GetOrder() { ... }

我怎样才能有一个方法将返回的 Order 对象动态转换为任何特定的对象:

private T GetSpecificOrder<T>(T order) : where T : Order
{
...
}

我想这样调用它:

var myOrder = GetOrder();
var specificOrder = GetSpecificOrder<Order>(myOrder);
HandleOrder(specificOrder);

我希望将 SpecificOrder 对象实例化为子类之一,以便我可以这样调用它:

HandleOrder(OrderA o) { ... }
HandleOrder(OrderB o) { ... }
HandleOrder(OrderC o) { ... }
HandleOrder(OrderD o) { ... }

我做错了什么?

最佳答案

听起来您希望在执行时发生重载解析。这不会发生......除非你使用 dynamic ,这可能是您最简单的解决方案:

dynamic order = GetOrder(orderId);
HandleOrder(order); // The right overload will be picked at execution time

另一种选择是使用 double-dispatch / the visitor pattern ,但我个人觉得这有点笨拙。

另一种选择是制作 Dictionary<Type, Action<Order>>像这样:

private static readonly Dictionary<Type, Action<Order>> orderHandlers = 
new Dictionary<Type, Action<Order>>
{
{ typeof(OrderA), order => HandleOrder((OrderA) order) },
{ typeof(OrderB), order => HandleOrder((OrderB) order) },
{ typeof(OrderC), order => HandleOrder((OrderC) order) },
{ typeof(OrderD), order => HandleOrder((OrderD) order) },
};

然后只需获取相关委托(delegate)并调用它即可:

orderHandlers[order.GetType()](order);

关于c# - 处理泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22565337/

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