.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 ...
随机推荐
- Java:PPT(X)转图片、PDF和SVG
(一) 简介: 工作中,PowerPoint文档有时需要被转换为PDF/图像文件来存档.因为PDF或图片的页面布局是固定的,很难被修改且能被大多数设备打开,所以PDF或者图片比起PowerPoint格 ...
- MongoDB使用教程收集(语法教程)
https://www.tutorialspoint.com/mongodb/index.htm https://wizardforcel.gitbooks.io/w3school-mongodb/c ...
- 测试使用markdonw写博客
# 欢迎使用 Cmd Markdown 编辑阅读器 ------ 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,**Cmd Markdown** 是我们给出的 ...
- Spring Boot为我们准备了最佳的数据库连接池方案,只需要在属性文件(例如application.properties)中配置需要的连接池参数即可。
Spring Boot为我们准备了最佳的数据库连接池方案,只需要在属性文件(例如application.properties)中配置需要的连接池参数即可.
- Vue中-下拉框可以选择可以填写
<el-form-item label="方法名称"> <el-autocomplete popper-class="my-autocomplete&q ...
- Android系统开发(4)——Autotools
Autotools工具的构成 1.autoscan autoscan是用来扫描源码文件夹生成configure.san文件的,configure.san包括了系统配置的基本选项.里面都是一些宏定义,我 ...
- 卸载MySQL 5.0
昨天在Navicat for mysql中导入一个脚本,执行.出现乱码. 考虑到可能是版本号问题,就想卸载了又一次安装MYSQL,这一卸载倒是出了问题.导致安装的时候安装不上. 后来无意发现是卸载的时 ...
- Chromium硬件加速渲染的UI合成过程分析
在Chromium中.Render端和WebGL端绘制出来的UI终于是通过Browser端显示在屏幕上的.换句话说.就是Browser端负责合成Render端和WebGL端的UI.这涉及到不同Open ...
- 软考之J2SE
特别感谢软考让我如今就接触了神奇的java.曾经尽管真不知道java是个神马,看完马士兵的视频发现里面的东西并不陌生.有vb,c++,c#做基础加上这次的J2SE发现原来编程语言有非常多同样的特性.也 ...
- android学习一(了解android)
声明:android学习文件中面的全部内容为都是整理来自第一行代码Android.在接下来的文章里我就不在进行反复的声明. 想看原版的能够买书看看.或者去作者的博客http://blog.csdn.n ...