第一章,第一节

用泛型替换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类的更多相关文章

  1. 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 ...

  2. 【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 ...

  3. 最新Android系统版本与API等级对应关系表

    最新Android系统版本与API等级对应关系表 从Android官网拷过来的,方便查阅... 官网地址:https://developer.android.com/guide/topics/mani ...

  4. JavaBean 内省API BeanUtils工具 泛型 xml xml约束

    1 什么是JavaBean?有何特征? 1)符合特定规则的类    2)JavaBean分二类:     a)侠义的JavaBean         .私有的字段(Field)         .对私 ...

  5. 【ASP.NET Web API教程】3.2 通过.NET客户端调用Web API(C#)

    原文:[ASP.NET Web API教程]3.2 通过.NET客户端调用Web API(C#) 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的 ...

  6. Vault 不同版本的API的异同

    大家知道,Autodesk Vault 2014有几个版本,依次为( Basic, Workgroup, Professional),不同版本的功能不相同,关于Vault产品功能的不同之处可以在Vau ...

  7. 版本和API Level对照表

    版本和API Level对照表 Code name Version API level (no code name) 1.0 API level 1 (no code name) 1.1 API le ...

  8. Android 系统名字、版本、API level的对应关系

    从官网上找到的,具体地址是: http://source.android.com/source/build-numbers.html Code name Version API level Lolli ...

  9. Android 系统版本和API level的关系表

    Android 系统版本和API level的关系表 wiki: https://zh.wikipedia.org/wiki/Android%E6%AD%B7%E5%8F%B2%E7%89%88%E6 ...

随机推荐

  1. 安装php rabbitmq扩展,继上一篇安装Rabbitmq

    1 安装 rabbitmq-c,C 与 RabbitMQ 通信需要依赖这个库,这里只贴出正确的步骤,错误类型太多,不一一举例,大部分都是安装问题,缺少组件,安装目录问题 git clone git:/ ...

  2. 滚动公告--jq

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. python jieba库

    https://www.cnblogs.com/snailclimb/p/9086433.html https://blog.csdn.net/codejas/article/details/8035 ...

  4. 基于继承的 MethodInterceptor 动态代理(换种写法)

    net.sf.cglib.proxy.Enhancer Generates dynamic subclasses to enable method interception. This class s ...

  5. python data science handbook1

    import numpy as np import matplotlib.pyplot as plt import seaborn; seaborn.set() rand = np.random.Ra ...

  6. UML顺序图知识点介绍(Sequence Diagram)

    消息 调用消息 调用(procedure call)消息的发送者把控制传递给消息的接收者,然后停止活动,等待消息接受者放弃会返回控制 在Rational Rose(2016版本如图所示) 异步消息 异 ...

  7. scrapy爬虫之断点续爬和多个spider同时爬取

    from scrapy.commands import ScrapyCommand from scrapy.utils.project import get_project_settings #断点续 ...

  8. API网关-Ocelot概述

    这个框架的整体思路其实就是Redirect请求并且附带一个简易的负载均衡机制,完全搭建MVC Core项目下在Ocelot项目启动的时候需要配置所有的ReRoute集合,这里的每一个ReRoute可以 ...

  9. windows10的环境变量path如何列表显示

    如果你的变量值以%开头,打开编辑的时候就会显示一串的变量值,不方便查找编辑 所以将变量值更改为以盘符开始,就可以解决这个问题,比如:D:\WorkSoft\app\product\11.2.0\dbh ...

  10. 1.1.5 PROB Friday the Thirteenth

    Friday the Thirteenth Is Friday the 13th really an unusual event? That is, does the 13th of the mont ...