Use Generic Replacements of 1.X Framework API Classes 用泛型替换Framework 1.X版本的API类
第一章,第一节
用泛型替换Framework 1.X版本的API类。
说起来,我是没接触过Framework 1.X版本的程序,12年毕的业(算算时间也一年多了,依旧一事无成,汗),毕业之后到公司实习,然后转正,做项目,都是直接基于Framework 4.0的项目。上来就是List<T> ,Dictionary<TKey,TValue>,用的挺顺的,记得当时还问过一个问题,IList<T>和List<T>有什么区别,现在想起来有点可笑,一个是接口,一个类,有什么好比的。。。毕竟一般情况下C#是实例不出一个接口的,至于特殊情况么,就是在操作Excel的时候,偶然发现,,注意,这个是Interface哦,具体原因,不晓得。。。知道的朋友告诉一声。
言归正传,按书上讲的,用泛型两个好处,第一,安全。原先Framwork 1.X版本的API类很多返回Object类型,Object作为所有类型的基类,别人(也包括自己)在使用的时候,就要转换成具体的类型,否则,怎么获取属性,怎么调用方法呢。但是,这种强制转换是否成功是要在程序运行时才能检查出来。看到这个,还真深有体会。做项目的时候使用了Convert.ToDateTime(obj)来获取时间,,这个方法的N个重载中,最后一个的方法签名是的,也就是说,可以传入任何类型,然后程序中傻傻的不晓得传入了一个什么,然后就没有然后了。第二,高效。说到高效,首先最容易想到的就是装箱和拆箱了。最近也在看CLR Via C#,里面说的挺清楚的。顺便说一点,讨论装箱和拆箱的前提是必须有值类型,否则免谈。Father son = new Son();这里没有任何装箱拆箱的操作。
上述两个理由应该足以让我们用泛型而“不用”Object。不用这个词肯定是太绝对的,因为存在总是合理的,总是有价值的。为什么有价值呢?因为他能用,而且有些地方也必须要用。所谓的泛型,
举个自己工作中的例子。前段时间的工作基本都是围绕淘宝,京东,阿里三个开放平台展开的,我负责项目的数据接口这一块。淘宝自己提供了.Net的SDK,用起来感觉挺不错的,but,京东,阿里只有Java的(哎),为了调用方便,于是着手想写两个SDK。期间有两个重要的收获。第一个是在类的定义上。贴一段代码,看看就晓得了。


//传入什么类型的Req,返回对应类型的Req
public interface IAliRequest<T> where T : AliResponse
{
String ApiName { get; } void Validate(); AliDictionary AddAppLevelParams();
}
具体到某个具体的类


/// <summary>
/// 获取订单详情
/// </summary>
public class OrderDetailGetReq : IAliRequest<OrderDetailGetRsp>
{
[XmlElement("orderId")]
public String OrderId { get; set; }
public string ApiName
{
get { return "trade.order.orderDetail.get"; }
} public void Validate()
{
RequestValidator.ValidateRequire("OrderId", OrderId);
} public AliDictionary AddAppLevelParams()
{
return AliUtils.AddAppLevelParams(this.GetType(), this);
}
}
这样一来,当new OrderDetailGetReq()之后,得到的Response就肯定是OrderDetailGetRsp。就不用再像最初想的,返回一个AliResponse,然后在强制转换成OrderDetailGetRsp。
第二点就是关于IList和IList<T>的。在通过调用API得到的Json串来构造实体类上,写方法的时候是不晓得T到底是什么类型的,但是可以确定的是,肯定是一个数组。泛型的具体类型是在编译的时候就可以确定的,也是一种强类型。
var jsonRst = JsonConvert.Import(json) as IDictionary;
JsonConvert是Jayrock.Json.Conversion命名空间下的,一个常用的Json解析工具。这里,就必须写成as IDictionary,因为如果用泛型,TKey和TValue是不晓得。
书本后面讲的是一些应用,好长,好长,硬着头皮看完了,感觉没学到什么东西。。好像都是一些常用的。
到这里吧,第一篇。
觉得有用,赞一个。else,忽略。
转载请注明出处。
Use Generic Replacements of 1.X Framework API Classes 用泛型替换Framework 1.X版本的API类的更多相关文章
- Web Api 2, Oracle and Entity Framework
Web Api 2, Oracle and Entity Framework I spent about two days trying to figure out how to expose the ...
- 【ASP.NET Web API教程】1.1 第一个ASP.NET Web API
Your First ASP.NET Web API (C#)第一个ASP.NET Web API(C#) By Mike Wasson|January 21, 2012作者:Mike Wasson ...
- 最新Android系统版本与API等级对应关系表
最新Android系统版本与API等级对应关系表 从Android官网拷过来的,方便查阅... 官网地址:https://developer.android.com/guide/topics/mani ...
- JavaBean 内省API BeanUtils工具 泛型 xml xml约束
1 什么是JavaBean?有何特征? 1)符合特定规则的类 2)JavaBean分二类: a)侠义的JavaBean .私有的字段(Field) .对私 ...
- 【ASP.NET Web API教程】3.2 通过.NET客户端调用Web API(C#)
原文:[ASP.NET Web API教程]3.2 通过.NET客户端调用Web API(C#) 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的 ...
- Vault 不同版本的API的异同
大家知道,Autodesk Vault 2014有几个版本,依次为( Basic, Workgroup, Professional),不同版本的功能不相同,关于Vault产品功能的不同之处可以在Vau ...
- 版本和API Level对照表
版本和API Level对照表 Code name Version API level (no code name) 1.0 API level 1 (no code name) 1.1 API le ...
- Android 系统名字、版本、API level的对应关系
从官网上找到的,具体地址是: http://source.android.com/source/build-numbers.html Code name Version API level Lolli ...
- Android 系统版本和API level的关系表
Android 系统版本和API level的关系表 wiki: https://zh.wikipedia.org/wiki/Android%E6%AD%B7%E5%8F%B2%E7%89%88%E6 ...
随机推荐
- laravel 对接 UCenter 基础
说明:1,运行环境 laravel 5.3 php7+nginx+mysql 2,使用安装包 https://github.com/goodspb/laravel5-ucenter 上面有对接方 ...
- elasticsearch中 refresh 和flush区别(转)
elasticsearch中有两个比较重要的操作:refresh 和 flush refresh操作 当我们向ES发送请求的时候,我们发现es貌似可以在我们发请求的同时进行搜索.而这个实时建索引并可以 ...
- cv2.cvtColor Unsupported depth of input image
源代码 import cv2 import numpy as ny img = ny.zeros( ( 3 , 3 )) img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) ...
- 机器学习常用sklearn库
Sklearn.model_selection(模型选择) Cross_val_score:交叉验证 Train_test_split:数据切割 GridsearchCV:网格搜索 Sklearn.m ...
- 7 week work
Dom和Bom的起源.方法.内容.应用. Dom:起源:首先听到Virtual DOM这个概念应该来自于React,并且在不了解时觉得这个概念是一个逼格特别高的词.其实任何技术的诞生都是有相应的历史的 ...
- Python OR & AND
These are the Boolean operations, ordered by ascending priority: Operation Result Notes x or y if x ...
- Qt Creator快捷键设置
QT Creator 下载地址 http://download.qt.io/ 一.快捷键配置方法: 进入“工具->选项->环境->键盘”即可配置快捷键. 二.常用默认快捷键: 编 ...
- jQuery常用选择器总结
jQuery常用选择器总结: 我们都知道jQuery是JavaScript(JS)的框架,它的语法简单使用方便,被广大开发人员青睐.现在我就它常用的并且十分强大的选择器的方式,做一个总结.鉴于它的选择 ...
- VSCode插件开发全攻略(四)命令、菜单、快捷键
更多文章请戳VSCode插件开发全攻略系列目录导航. 命令 我们在前面HelloWord章节中已经提到了命令写法,这里再重温一下. context.subscriptions.push(vscode. ...
- Javascript高级编程学习笔记(33)—— 客户端检测(2)怪癖检测
怪癖检测 和能力检测类似,但其目标不同 能力检测的目的是判断浏览器支不支持某种能力 而怪癖检测的目的是判断浏览器是否存在某些缺陷 这种时候需要我们执行一段代码来判断浏览器是否有这样的缺陷 或者说是怪癖 ...