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的时候,偶然发现,Use Generic Replacements of 1.X Framework API Classes 用泛型替换Framework 1.X版本的API类,注意,这个是Interface哦,具体原因,不晓得。。。知道的朋友告诉一声。

言归正传,按书上讲的,用泛型两个好处,第一,安全。原先Framwork 1.X版本的API类很多返回Object类型,Object作为所有类型的基类,别人(也包括自己)在使用的时候,就要转换成具体的类型,否则,怎么获取属性,怎么调用方法呢。但是,这种强制转换是否成功是要在程序运行时才能检查出来。看到这个,还真深有体会。做项目的时候使用了Convert.ToDateTime(obj)来获取时间,,这个方法的N个重载中,最后一个的方法签名是Use Generic Replacements of 1.X Framework API Classes 用泛型替换Framework 1.X版本的API类的,也就是说,可以传入任何类型,然后程序中傻傻的不晓得传入了一个什么,然后就没有然后了。第二,高效。说到高效,首先最容易想到的就是装箱和拆箱了。最近也在看CLR Via C#,里面说的挺清楚的。顺便说一点,讨论装箱和拆箱的前提是必须有值类型,否则免谈。Father son = new Son();这里没有任何装箱拆箱的操作。

上述两个理由应该足以让我们用泛型而“不用”Object。不用这个词肯定是太绝对的,因为存在总是合理的,总是有价值的。为什么有价值呢?因为他能用,而且有些地方也必须要用。所谓的泛型,

举个自己工作中的例子。前段时间的工作基本都是围绕淘宝,京东,阿里三个开放平台展开的,我负责项目的数据接口这一块。淘宝自己提供了.Net的SDK,用起来感觉挺不错的,but,京东,阿里只有Java的(哎),为了调用方便,于是着手想写两个SDK。期间有两个重要的收获。第一个是在类的定义上。贴一段代码,看看就晓得了。

Use Generic Replacements of 1.X Framework API Classes 用泛型替换Framework 1.X版本的API类Use Generic Replacements of 1.X Framework API Classes 用泛型替换Framework 1.X版本的API类
    //传入什么类型的Req,返回对应类型的Req
public interface IAliRequest<T> where T : AliResponse
{
String ApiName { get; } void Validate(); AliDictionary AddAppLevelParams();
}

具体到某个具体的类

 
Use Generic Replacements of 1.X Framework API Classes 用泛型替换Framework 1.X版本的API类Use Generic Replacements of 1.X Framework API Classes 用泛型替换Framework 1.X版本的API类
    /// <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,忽略。

转载请注明出处。

上一篇:vue引用ionic4


下一篇:[Leetcode][Python]30: Substring with Concatenation of All Words