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

本文关键字:实例 派生 抽象类 创建 动态 | 更新日期: 2023-09-27 18:01:00

我有两个类,它们是从抽象类派生的

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是为customertype"Trade"创建的,LibraryOrder是为customertype"Library"创建的。

客户类型将在不久的将来增长。

如何在不使用if…else或swith…的情况下基于客户类型创建派生类的实例。。。案例

该类的实例将调用导出方法来创建或更新销售订单。

-Alan-

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

这里有一种实现您想要的东西的方法。我们可以称之为"约定而非配置方法",因为很明显,派生的订单类型名称和枚举名称必须匹配。

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() { }
    }
}

我建议有一个对象类型名称和类型的映射,并根据映射创建实例。映射详细信息可以在代码中初始化,也可以从外部源(Ex.Config文件(初始化。

    enum OrderType
    {
        TradeOrder,
        LibraryOrder
    }
    Dictionary<OrderType, Type> _orderTypeMap = new Dictionary<OrderType, Type>
    {
        { OrderType.LibraryOrder, typeof(LibraryOrder)},
        { OrderType.TradeOrder, typeof(TradeOrder)}
    };
    Order GetOrderInstance(OrderType orderType)
    {
        return Activator.CreateInstance(_orderTypeMap[orderType]) as Order;
    }