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/