c# - 处理泛型

标签 c# .net generics visual-studio-2008 .net-3.5

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/

相关文章:

c# - MVC Windows 身份验证 + 通过 AspNetUserRoles 表进行角色管理

c# - HttpWebResponse 不会针对并发出站请求进行扩展

.net - 在 C++ 中测试鼠标左键和右键单击

c# - 使用 Reporting Services 将组保持在一页上

java - 使 Java 类通用,但仅适用于两种或三种类型

java - 如何将泛型与类数组一起使用?

generics - F# 类型函数和 [<GeneralizableValue>] 属性

c# - 如何在调用 Main() 方法后打印任何值?

c# - (不?)使用 JavaScriptSerializer 将 xml 文件(未知模式)转换为 c# 中的 json

c# - 屏幕阅读器的辅助功能(例如 Jaws)