第一章,第一节

用泛型替换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. 【慕课网实战】三、以慕课网日志分析为例 进入大数据 Spark SQL 的世界

    前置要求: 1)Building Spark using Maven requires Maven 3.3.9 or newer and Java 7+ 2)export MAVEN_OPTS=&qu ...

  2. uva10256(计算几何)

    省选前练模板系列: #include<cmath> #include<cstdio> #include<cstring> #include<iostream& ...

  3. php中出现乱码

    对于初学着来说,编辑中文php时,会出现乱码 在php代码中加入 随后在浏览器中,就会看到如下页面 这样就解决了php 中文乱码的问题.

  4. listcard记录

    .listcard-bg{ .listcard-head{ background: #F34A55; width: 100%; height: 50px; margin-bottom: -50px; ...

  5. spark wordcount 编程模型详解

    spark wordcount中一共经历多少个RDD?以及RDD提供的toDebugString    在控制台输入spark-shell   系统会默认创建一个SparkContext   sc h ...

  6. delphi压缩与解压_不需要特别的控件

    unit unzip; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  7. C#基础笔记

    第一章: 1.C#创建程序的基本结构 class 类名 { static void Main(string[]args) { } } 注意:1)namespace2)using3)类名命名规则:字母. ...

  8. linux下如何把php升级到5.6

    1: 进入终端后查看php版本 php -v 输出可能如下: PHP (cli) (built: Nov ::) Copyright (c) - The PHP Group Zend Engine v ...

  9. LabVIEW(九):程序结构中的分支结构和顺序结构

    一.分支结构 1.创建分支结构:程序框图右键>结构>条件结构 2.Ctrl + I 会显示错误列表,双击错误列表会定位到该错误在程序框图中地方. 3.有的分支可以不连接分支内容. 在不连接 ...

  10. feign包名路径添加问题

    1. feign包名路径添加问题 1.1. 问题 在SpringCloud中使用feign调用路径中,不能在类上直接添加@RequestMapping(value = "/hospital- ...