.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 ...
随机推荐
- Spring Boot多数据源连接8小时后断开的问题解决(MySQL)
这个问题涉及的方面很多,需要一步步去排查,可能环境有问题,数据库有问题,但是网上最多的应该是如下的方式去解决. 以单个数据源为主,多个数据源基本方法一致. 1.MySQL 5版本之前可以通过在URL后 ...
- JSP的过滤器
以下内容引用自http://wiki.jikexueyuan.com/project/jsp/writing-filters.html: Servlet和JSP过滤器都是Java类,可以在Servle ...
- Good Zookeeper Tutorial with Java client
参考: https://stackoverflow.com/questions/33524537/good-zookeeper-tutorial-with-java-client I was tryi ...
- 我和nupt集训队的故事
纯水文,如有不适请ctrl+w撤离 亚洲赛刚结束.看了不少巨巨的退役贴以及岛娘在知乎上的那篇感天动地的人生经历.多少有点夜深忽梦少年事的错觉.作为一个两年前就打出gg的高龄选手,之后又强行以1次队员和 ...
- mysql group by 组内排序 group by 原理
mysql group by 组内排序 SELECT * FROM (SELECT MAX(id) AS t,wukong_uid, 1 AS tag FROM toutiao_uid_gath ...
- Hibernate- Criteria 简易
package cn.demo; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Session; ...
- 2015-2016 ACM-ICPC Pacific Northwest Regional Contest (Div. 2)V - Gears
Problem V | limit 4 secondsGearsA set of gears is installed on the plane. You are given the center c ...
- js二维数组定义和初始化的三种方法总结
js二维数组定义和初始化的三种方法总结 方法一:直接定义并且初始化,这种遇到数量少的情况可以用var _TheArray = [["0-1","0-2"],[& ...
- Silverlight调用WCF(1)
[置顶] Silverlight调用WCF(1) 分类: 技术2012-03-31 12:29 940人阅读 评论(0) 收藏 举报 wcfsilverlightexceptionusersecuri ...
- Python基础Web服务器案例
一.WSGI 1.PythonWeb服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI) 是Python应用程序或框架和Web服务器之间的一种接口, ...