场景

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

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. Maven公共仓库/镜像站收集及使用技巧

    查询: 1.http://search.maven.org/ 2.https://mvnrepository.com/ 3.https://maven-repository.com/ 4.(阿里云镜像 ...

  2. 【Windows系统】-- 远程桌面时,WIN键被锁定

    问题重现: 在对远程机器进行操作的时候,按键时会自动变成WIN组合键,比如:你按D的效果为[WIN+D]组合键的效果 就是切换到桌面,按E就是[WIN+E]组合键的效果,就是打开资源管理器. 解决方案 ...

  3. pymongo collection.save 问题

    项目中有这样一个需求,把路由器信息存入mongo,DB的结构如下: { router_name: name, router_ip: ip, interfaces: [ {oid:1,name:if1} ...

  4. JAVA OO之 类、对象、包

    类 类是具有相同属性和行为的一组对象的集合. public class HomeWork1 { public static void main(String[] args) { MyPhone mp= ...

  5. mainboard

    MAINBOARD ★ CPU(type, speed, amount, cache, slot or socket, fan) ★ RAM(the most capacity, amount, fr ...

  6. Windows Update 的工具

    Windows Update MiniTool 是一款管理 Windows Update 的工具,可以取得微軟 Windows 修補程式更新包,Windows Update 是我們用來升級系統的元件, ...

  7. C++学习之构造函数中的异常处理

    构造函数中可不可以抛出异常?当然可以.从语法上来说,是可以的:从实际情况来看,现在的软件系统日渐庞大和复杂,很难保证 Constructor 在执行过程中完全不发生一点异常. 那么,如果构造函数中抛出 ...

  8. Linux 命令修改系统时间

    修改linux的系统时间使用date指令,date命令的功能是显示和设置系统日期和时间. 输入date 查看目前系统时间. 修改时间需要 date -功能字符 修改内容 命令中各选项的含义分别为:-d ...

  9. Explicit Interface Implementation (C# Programming Guide)

    https://msdn.microsoft.com/en-us/library/ms173157.aspx If a class implements two interfaces that con ...

  10. 配置Cocos Code IDE 可以正常运行的组合:jdk,sdk ,ndk, ant, cocos2d-x

    Cocos Code IDE:Cocos Code IDE 1.0.0-RC2 jdk:Cocos Code IDE 自动的jdk sdk:8以上 ndk:r9d(r10有bug),希望以后版本可以修 ...