我有两个派生自抽象类
的类abstract class Order
{
public virtual boolean Export()
{
...
}
}
class TradeOrder : Order
{
public override bool Export()
{
//Create a new order
}
}
class LibraryOrder : Order
{
public override bool Export()
{
//Dont create order but Update an existing order
}
}
TradeOrder是为customrtype“Trade”创建的,LibraryOrder是为customrtype“Library”创建的。
客户类型将在不久的将来增长。
如何根据客户类型创建派生类的实例,而不使用if ... else或swicth ... case?
该类的实例将调用导出方法来创建或更新销售订单。
-Alan -
答案 0 :(得分:0)
这是实现目标的一种方法。我们可以将其称为“约定优于配置方法”,因为显然,您的派生订单类型名称和您的枚举名称必须匹配。
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var customerType = CustomerType.Library;
var order = (Order)Activator.CreateInstance("ConsoleApplication2", "ConsoleApplication2." + customerType.ToString() + "Order").Unwrap();
}
}
public enum CustomerType
{
Trade,
Library
}
public abstract class Order
{
public virtual void Export() { }
}
public class TradeOrder : Order
{
public override void Export() { }
}
public class LibraryOrder : Order
{
public override void Export() { }
}
}
答案 1 :(得分:0)
我建议有一个对象类型名称和类型的映射,并根据映射创建实例。可以在代码中或从外部源(例如,配置文件)初始化映射详细信息。
public override IQueryable ApplyQuery(IQueryable queryable, ODataQueryOptions queryOptions)
{
if (queryOptions.SelectExpand != null)
{
foreach (var selectItem in queryOptions.SelectExpand.SelectExpandClause.SelectedItems)
{
var expandedItem = selectItem as ExpandedNavigationSelectItem;
if (expandedItem != null)
{
// get the entitySetName, tableName
string entitySetName = expandedItem.NavigationSource.Name;
// can go recursive with expandItem.SelectExpandClause in case we have $epxand=A($expand=B)
}
}
}
return base.ApplyQuery(queryable, queryOptions);
}