.Net实战之反射外卖计费
场景
叫外卖支付,可以有以下优惠:
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实战之反射外卖计费的更多相关文章
- Android 设计模式实战之关于封装计费代码库的策略模式详谈
写在之前 这周生活上出现了很多的不如意,从周一开始就觉得哪里出现了问题,然后就是各种烦躁的情绪,后来事情还真是如预感的那样发生了,很是心痛,但也无可奈何,希望大家都好好珍惜自己身边的人:友人,亲人,家 ...
- .Net实战之反射相关类之间的人体经络关系
--1.类的部分组成成员 --2.巧记成员之间的关系 [MyTable("T_UserInfo")] public class UserInfo : Person, UserSer ...
- Vue 实战项目: 硅谷外卖(1)
第 1 章: 准备 1.1. 项目描述 1) 此项目为外卖 WebApp(SPA) 2) 包括商家, 商品, 购物车, 用户等多个子模块 3) 使用 Vue 全家桶+ES6+Webpack 等前端最新 ...
- IT知识圈视频学习资源整理贴
原文地址 热门课程 1.2019 尚学堂大数据全套视频教程(视频.源码.课件) 2.IDEA破解补丁(支持最新2019.2) 3.2019年 MySQL DBA 6期视频教程 4.微信小程序实战开发特 ...
- C#反射基础知识和实战应用
首先来说一下什么是反射? 反射提供了封装程序集.模块和类型的对象(Type类型) 可以使用反射动态的创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后,可以调用类型的方法或访问其字段和 ...
- Java反射实战
一.背景 最近的项目中需要使用到Java 反射的知识,以前不怎么了解,也基本没怎么用过,抽出一片时间,来具体学习和实战下Java的反射!拿来和大家分享以及记录方便以后学习! 二.反射相关概念解析 1. ...
- 实战Java的反射机制
众所周知,Java要调用某个对象的方法首先需要对象实例化后才能调用. 而实例化对象常见的就是new执行和spring(DI)的依赖注入了. Spring的DI其实就是以反射作为最基础的技术手段. 一. ...
- (转)反射发送实战(-)InvokeMember
反射是.net中的高级功能之一,利用反射可以实现许多以前看来匪夷所思的功能,下面是我看了<Programming C#>(O'Reilly)之后对于反射的一点实践,本想直接做个应用程序来说 ...
- 《精通Spring4.X企业应用开发实战》读后感第四章(Java反射)
package com.smart.reflect; public class Car { private String brand; private String color; private in ...
随机推荐
- 【转】Golang 关于通道 Chan 详解
原文:http://blog.csdn.net/netdxy/article/details/54564436 在用 chan 类型时,发生死锁的错误,表面上看不出什么问题 ------------- ...
- Erlang 又生虫了
好久不玩Erlang了.近期想鼓捣Eresye,下了个最新版OTP 17,结果.发现了问题. 安装这个最新版的Erlang (erl 6.0)后,用erlc编译了Eresye 1.2.5,并放入其li ...
- vux 实现多栏滚动
1.PopupPicker 组件 <!-- vux-ui --> <template> <div> <!-- 标题栏 --> <x-header ...
- DES加密算法的C++实现
<信息安全技术>这门课又在讲 DES 加密算法了,以前用纯C写过一次,这次我用 C++ 重新写了一个,写篇文章以备后用.本文介绍了 DES 算法加密的大致步骤和整体流程. 一.DES算法原 ...
- 另存为Alt-F-A ©┗ 最近使用的文档/选项
另存为Alt-F-A © ┗ 最近使用的文档/选项
- Python开发【面向对象编程】
一.概述 面向过程:根据业务逻辑从上到下,完成代码: 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可: 面向对象:对函数进行分类和封装. 二.面向对象 1.类.对象.方法.实例 ...
- Android实战简易教程-第四十五枪(SlideSwitch-好看又有用的开关button)
开关button也是在项目中经经常使用到的控件,github上有开源的项目,我们研究下它的用法: 1.SlideButton.java: /* * Copyright (C) 2015 Quinn C ...
- 【bzoj1787】&【bzoj1832】[Ahoi2008]Meet 紧急集合 & 聚会
bzoj1787就是bzoj1832 bzoj1832 空间和时间少了一些... 求三个结点到一个结点距离之和最小的结点以及距离和 求出两两lca,其中有两个相同,答案则为另一个 感觉就是一大暴力.. ...
- sparksql语句
(1)in 不支持子查询 eg. select * from src where key in(select key from test);支持查询个数 eg. select * from src w ...
- [LeetCode] Construct Binary Tree from Inorder and Pretorder Traversal
Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...