假设我的数据库中有一个名为Couriers的表,还有一个名为Couriers(DbContext.Couriers)的实体框架类,其示例数据为: Id:1。名称:UPS Id:2。姓名:DHL
我已经使用两个子类CourierUPS和CourierDHL扩展了这个类,并且两个都有一个名为PrintSticker()的新方法,它与UPS和DHL不同(每个公司需要不同的贴纸格式)。
我还有一个组合视图,可以选择UPS或DHL以及调用所选Courier的PrintSticker方法的按钮。
嗯,问题是我可以使用IF语句创建对象(如果selectedCourier =“UPS”创建新的CourierUPS elseif selectedCourier =“DLH”创建新的CourierDHL ...它只是伪代码),但它不是一个好方法,因为如果我想在未来创建FedEx快递,我将需要更改IF声明,所以我想我会变得一团糟。
我想要达到的目的是通过dinamycally获得这个:
C#
CourierUPS courier = new CourierUPS;
VB.NET
Dim courier as CourierUPS = new CourierUPS
问题是:
1)是否有一种简单的方法可以在表格中保存类的名称(CourierUPS,CourierDHL等),并使用代码创建新对象?
2)是否有一种简单的方法来动态构建类的名称,将快递(DHL或UPS)的名称附加到“Courier”字样? Courier + UPS = CourierUPS,所以我们的代码将使用该类。
C#或VB.NET解决方案都会受到赞赏。
谢谢
答案 0 :(得分:2)
您可以尝试的选项是创建工厂字典以创建每种类型。
从这开始:
var factory = new Dictionary<string, Func<Courier>>()
{
{ "UPS", () => new CourierUPS() },
{ "DHL", () => new CourierDHL() },
};
现在您可以创建&#34; UPS&#34;或者&#34; DHL&#34;快递是这样的:
var courier = factory["UPS"].Invoke();
但是,如果您现在想要配置一个新的快递,您可以将字典传递给可以添加&#34; FedEx&#34;的方法,您可以像这样添加它:
factory["FedEx"] = () => new CourierFedEx();
现在您可以在主代码中执行此操作:
var courier = factory["FedEx"].Invoke();
它是基本的,但它确实有效。