场景

叫外卖支付,可以有以下优惠:

1、  满30元减12

2、  是会员减配送费,比如5元

3、  优惠券

….

问题? 如何在不改代码的情况下更灵活的去控制优惠的变化???

有些代码与实际业务可能不符合,旨在体验反射的用处

   public interface IDiscount
{
/// <summary>
/// 优惠名称
/// </summary>
string Name { get; } /// <summary>
/// 金额
/// </summary>
/// <param name="money"></param>
/// <returns></returns>
double CalcMoney(double totalMoney);
}

--代金券

namespace CashLib
{
/// <summary>
/// 代金券
/// </summary>
public class CashDiscount:IDiscount
{
public string Name
{
get { return "代金券:兔子粮票2元,可抵扣2元"; }
} public double CalcMoney(double totalMoney)
{
return totalMoney - ;
}
}
}

--会员

namespace MembeLib
{
/// <summary>
/// 会员
/// </summary>
public class MemberDiscount:IDiscount
{
public string Name
{
get { return "会员免5元配送费"; }
} public double CalcMoney(double totalMoney)
{
return totalMoney - ;
}
}
}

--满金额减免

namespace MinusLib
{
/// <summary>
/// 足价减金额
/// </summary>
public class MinusDiscount : IDiscount
{
public string Name
{
get { return "满30减12元"; }
} public double CalcMoney(double totalMoney)
{
return totalMoney - ;
}
}
}

--读取优惠策略的程序集,动态创建类的对象并调用类的成员

    public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} Dictionary<string, object> dict = new Dictionary<string, object>();
private void Form1_Load(object sender, EventArgs e)
{
string dllPath = AppDomain.CurrentDomain.BaseDirectory + "DiscountLib/";
string[] assFiles = System.IO.Directory.GetFiles(dllPath, "*.dll");
foreach (var dllItem in assFiles)
{
Assembly ass = Assembly.LoadFrom(dllItem); foreach (Type type in ass.GetTypes())
{
if (typeof(IDiscount).IsAssignableFrom(type))
{
object instanceDiscount = ass.CreateInstance(type.FullName);
PropertyInfo propDiscountName = type.GetProperty("Name");
string discountName = propDiscountName.GetValue(instanceDiscount).ToString(); this.listBox1.Items.Add(discountName);
dict.Add(discountName, instanceDiscount); }
}
}
} private void button1_Click(object sender, EventArgs e)
{
CustomerOrder cusOrder = new CustomerOrder("张三", );
foreach (string item in this.listBox1.SelectedItems)
{
cusOrder.AddDiscount(dict[item] as IDiscount);
}
cusOrder.UseDiscount();
} }

--存放优惠券程序集

--结果

--无优惠券

--选择了代金券粮票

--会员+代金券

--全选

--有新的优惠券,只需将新的dll放在Debug\DiscountLib文件夹中,系统加载时候会自动加载全部优惠

--去掉或修改某个优惠,只需直接修改相应代码或删除某程序集,不影响其他优惠业务。。。。

--反射结合抽象类或接口,将会很大程度的提高了程序的拓展性

--时间仓促,写的不是很细,更多细节以及反射的操作见下篇,保证这辈子永远都会熟悉使用反射,如有兴趣扫描加入程序员工作聊(必须是程序员)的微信讨论组或QQ群

--代码在QQ群

.Net实战之反射外卖计费的更多相关文章

  1. Android 设计模式实战之关于封装计费代码库的策略模式详谈

    写在之前 这周生活上出现了很多的不如意,从周一开始就觉得哪里出现了问题,然后就是各种烦躁的情绪,后来事情还真是如预感的那样发生了,很是心痛,但也无可奈何,希望大家都好好珍惜自己身边的人:友人,亲人,家 ...

  2. .Net实战之反射相关类之间的人体经络关系

    --1.类的部分组成成员 --2.巧记成员之间的关系 [MyTable("T_UserInfo")] public class UserInfo : Person, UserSer ...

  3. Vue 实战项目: 硅谷外卖(1)

    第 1 章: 准备 1.1. 项目描述 1) 此项目为外卖 WebApp(SPA) 2) 包括商家, 商品, 购物车, 用户等多个子模块 3) 使用 Vue 全家桶+ES6+Webpack 等前端最新 ...

  4. IT知识圈视频学习资源整理贴

    原文地址 热门课程 1.2019 尚学堂大数据全套视频教程(视频.源码.课件) 2.IDEA破解补丁(支持最新2019.2) 3.2019年 MySQL DBA 6期视频教程 4.微信小程序实战开发特 ...

  5. C#反射基础知识和实战应用

    首先来说一下什么是反射? 反射提供了封装程序集.模块和类型的对象(Type类型) 可以使用反射动态的创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后,可以调用类型的方法或访问其字段和 ...

  6. Java反射实战

    一.背景 最近的项目中需要使用到Java 反射的知识,以前不怎么了解,也基本没怎么用过,抽出一片时间,来具体学习和实战下Java的反射!拿来和大家分享以及记录方便以后学习! 二.反射相关概念解析 1. ...

  7. 实战Java的反射机制

    众所周知,Java要调用某个对象的方法首先需要对象实例化后才能调用. 而实例化对象常见的就是new执行和spring(DI)的依赖注入了. Spring的DI其实就是以反射作为最基础的技术手段. 一. ...

  8. (转)反射发送实战(-)InvokeMember

    反射是.net中的高级功能之一,利用反射可以实现许多以前看来匪夷所思的功能,下面是我看了<Programming C#>(O'Reilly)之后对于反射的一点实践,本想直接做个应用程序来说 ...

  9. 《精通Spring4.X企业应用开发实战》读后感第四章(Java反射)

    package com.smart.reflect; public class Car { private String brand; private String color; private in ...

随机推荐

  1. JSON/xml、Processing 以及收集Java的设计模型

    JSON简介: 1.基本介绍 JSON(JavaScriptObject Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于ECMAScript(欧洲计算机协会制定的js规范)的 ...

  2. Ubuntu 16.04安装WinRAR/7-Zip(基于CrossOver)

    基于CrossOver的WinRAR/7-Zip有如下缺点: 1.不能像Windows那样右键菜单解压 可以解决的问题: 1.可以使用提供的浏览工具进行文件选择再解压,只是在操作上多一步. 2.类似百 ...

  3. java STW stop the world 哈哈就是卡住了

    java  STW  stop the world 哈哈就是卡住了 学习了:http://www.jb51.net/article/125400.htm

  4. 如何以正确的顺序重新安装驱动程序 | Dell 中国

      购买 支持 社区 我的帐户     购买 支持 社区   如何以正确的顺序重新安装驱动程序 在戴尔笔记本电脑或台式机上手动重新安装Microsoft Windows操作系统后,您还必须以正确的顺序 ...

  5. vi,vim的基本使用方法

    "i”插入 "/" 查找 "wq"保存退出 "q!"不保存退出

  6. hdu 2544 最短路(SPFA算法)

    本题链接:点击打开链接 本题大意: 首先输入一个n,m.代表有n个点.m条边.然后输入m条边,每条边输入两个点及边权.1为起点,n为终点.输入两个零表示结束. 解题思路: 本题能够使用SPFA算法来做 ...

  7. Mariadb 索引及外键

    索引 索引相当于一本书的目录,在一个数据库或表有索引的情况下,会很便于查询数据,使查询更加效率,相对的也有缺点,不利于去修改,比较麻烦,有索引便于查询,那就意味着索引创建的越多越好么?然而并不是:索引 ...

  8. js 返回顶部

    <script> window.onload = function(){ var oTop = document.getElementById("to_top"); v ...

  9. 告诉大家我是如何在14:00秒杀到 《深入理解Bootstrap》

    1.打开火狐,不用IE,3个评论窗口,层叠在一起,可以点击3次哦. 2.打开一个百度的现在时间,不能看你本机的时间,要互联网的时间. 3.等时间到13:59:59,开始依次点击按钮,总有你预想不到的结 ...

  10. 解决Hibernate4执行update操作,不更新数据的问题

    后台封装java对象,使用hibernate4再带的update,执行不更新数据,不报错. 下面贴出解决方法: 失败的方法 hibernate自带update代码:(失效) Session sessi ...