动态创建从抽象类派生的类的实例

时间:2016-08-05 03:02:09

标签: c# oop abstract-class

我有两个派生自抽象类

的类
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 -

2 个答案:

答案 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);
}