协会进程,api知识总括

By admin in 4858.com on 2019年5月4日

       
 目前在做公司的连串,自个儿承担webapi的框架的搭建与开拓,近日很忙,平昔没时间对职业中遭逢的知识点缺少个总结,现总结一下,对友好是个晋级,假如个人的小点点小总计能对博友有援助那也是善莫斯中国科学技术大学学焉.

花色中的web api知识总括,webapi知识计算

       
 近来在做公司的项目,自个儿背负webapi的框架的搭建与支出,近期很忙,一向没时间对职业中相遇的知识点缺乏个小结,现计算一下,对团结是个进级,假设个人的小点点小总计能对博友有扶助那也是善莫斯中国科学技术大学学焉.

(一)、 首先说一下c#
dynamic,dynamic是FrameWork四.0的新脾性.笔者在api中用了相比较多的dynamic,首先个人感觉dynamic能使代码变得优雅,能够节约定义多余的实体,dynamic是运转时调整项目有啥样属性,蕴含赋值和取值都能够不管钦定属性,

例如:

dynamic sourceInfo = SqlDataHelper.GetWebDMDynamicData(sourceIdSql, new {id=3).FirstOrDefault();
                    if (null != sourceInfo)
                    {
                        item.SourceId = sourceInfo.SourceId;
                        item.DocType = sourceInfo.DocType;
                        item.InvestmentType = sourceInfo.InvestmentType;
                    }

如上代码中sourceInfo钦赐了dynamic,开辟人士知道假设取值成功必然会有SourceId属性,所以item.SourceId
= sourceInfo.SourceId;赋值就寻常了.

一样如下代码也能够和煦为dynamic随意钦赐属性:

1 dynamic data= null;
2 data= SqlDataHelper.GetWebDMDynamicData(sql, new { Id = id }).ToList().FirstOrDefault();
3 data.a= 124;
4 data.b= "test2";
5 data.c="test3";

可感觉dynamic类型data随意钦定属性,前提条件是在第(二)步骤时data的值不能够为空,不然在第(三)步data是null,那时候就能够油但是生空非凡.

(二)、再商讨一下轻量级的OENCOREM框架,那几个框架网络1度浸泡了多量的学习资料,本身只是对品种中的使用体验做些总结,不对之处接待指正.

       
我们通晓调用数据仓库储存款和储蓄进程明确有参数化,dapper提供了二个相比较好的参数化对象DynamicParameters,上代码:

DynamicParameters dynamicParameters = new DynamicParameters();
            dynamicParameters.Add("@p_Id1", id1, DbType.String);
            dynamicParameters.Add("@p_Id2", id2, DbType.Int32);
            dynamicParameters.Add("@p_dateTime", dateTime, DbType.DateTime);
            List<dynamic> info =  conn.Query<T>(storeProcedureName,dynamicParameters, null, true, null, CommandType.StoredProcedure) as List<T>;

       
如若要内定实行存款和储蓄进程,那么要钦赐CommandType.StoredProcedure关键字.

 (三)、以下是List<T>转dataTable的措施,的确为类型转换省去了成都百货上千的代码,不过也有1个要好花了点时间未有消除的主题素材,正是T必须钦定实体类型,而不可能采取dynamic,不然type.GetProperties

取不到准确的属性,那样系统就不可能不多定义一个实体类传进来.

 public static DataTable ToDataTable<T>(IList<T> list)
        {
            //create propertyInfo
            List<PropertyInfo> pList = new List<PropertyInfo>();
            //get reflector interface
            Type type = typeof(T);
            DataTable dt = new DataTable();
            //add datatable column
            Array.ForEach<PropertyInfo>(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, Nullable.GetUnderlyingType(
            p.PropertyType) ?? p.PropertyType); });
            foreach (var item in list)
            {
                //create new row
                DataRow row = dt.NewRow();
                pList.ForEach(p => row[p.Name] = p.GetValue(item, null)??System.DBNull.Value);
                dt.Rows.Add(row);
            }
            return dt;
        }

好了,以上便是种类中的一些相当的小总计,还有一对零星的知识点不做过多描述了.经过品种进度中还有大多要学习的工夫,尤其是关联才能,技术引导工作技巧.

api知识总计,webapi知识总结近年来在做公司的花色,自身担任webapi的框架的搭建与开采,近来很忙,平昔没时间对工作中相见的…

本子记录

(一)、 首先说一下c#
dynamic,dynamic是FrameWork肆.0的新性情.笔者在api中用了比较多的dynamic,首先个人认为dynamic能使代码变得优雅,能够节约定义多余的实体,dynamic是运营时间调节制项目有怎么样属性,包含赋值和取值都能够不管钦赐属性,

版本号 时间
V1.0 2017.07.29

例如:

前言

自个儿是swift二.0的时候开头接触的,记得那时候还不是很牢固,企业的类型也都以用oc做的,并不对swift很珍视,小编本人学了一段时间,到前几日swift3.0+已经出来了,本身平时也不写,忘记的也大略了,正好项目那段时间已经上线了,不是很忙,笔者就足以每日总括一点了,希望对团结对大家全体辅助。在计算的时候作者会相比oc进行认证,有代码的作者会给出相关比对代码。
一. swift轻便计算(1)——
数据轻松值和类型转变
二. swift轻巧计算(二)——
轻巧值和调节流
3. swift简单计算(三)——
循环调节和函数
4. swift轻便总结(4)——
函数和类
5. swift轻易总括(伍)——
枚举和结构体
陆. swift轻便总括(6)——
协议扩张与泛型
柒. swift轻易总计(7)——
数据类型
8. swift轻便总结(8)——
外号、布尔值与元组
九. swift容易总括(9)——
可选值和断言
10. swift轻巧总括(10)——
运算符
1壹. swift轻松总括(拾1)——
字符串和字符
1二. swift轻巧总计(102)——
集合类型之数组
13. swift轻便总括(103)——
集结类型之字典
1四. swift轻松总结(10四)——
调整流
协会进程,api知识总括。一⑤. swift轻巧总计(十伍)——
调控转移语句
1陆. swift轻巧总计(十6)——
函数
壹七. swift轻易总括(拾7)——
闭包(Closures)
1捌. swift轻巧总结(拾捌)——
枚举
1玖. swift轻便计算(十玖)——
类和结构体
20. swift轻便总括(二拾)——
属性
贰1. swift轻巧计算(二10一)——
方法
2贰. swift轻便总计(二拾2)——
下标脚本
二叁. swift简单计算(二103)——
承接

dynamic sourceInfo = SqlDataHelper.GetWebDMDynamicData(sourceIdSql, new {id=3).FirstOrDefault();
                    if (null != sourceInfo)
                    {
                        item.SourceId = sourceInfo.SourceId;
                        item.DocType = sourceInfo.DocType;
                        item.InvestmentType = sourceInfo.InvestmentType;
                    }

结构进度 – Initialization

此间要说一下构造进度,构造进程是为着利用有个别类、结构体恐怕枚举类型的实例而张开的计划进度。这么些进度包括了为实例中的每一个属性设置开首值和为其试行必要的备选和初叶化职分。

布局进度是通过定义构造器(Initialization)来贯彻的,这么些构造器能够看成是用来创设特定项目实例的出格措施,swift4858.com ,中的构造器没有供给重临重临值,它们的首要任务是保障新实例在率先次使用前成功科学的开端化。

类实例能够由此析构器(deinitializer)在类实例释放在此之前实施一定的精晓工作。

这一篇从上边多少个地点批注:

  • 存款和储蓄型属性的初阶值
  • 定制化构造进程
  • 暗中认可构造器
  • 值类型的构造器代理

如上代码中sourceInfo钦定了dynamic,开采人士知道如若取值成功一定会有SourceId属性,所以item.SourceId
= sourceInfo.SourceId;赋值就不意外了.

存款和储蓄型属性的开首赋值

类和结构体在实例成立时,必须为全部存款和储蓄型属性设置合适的初阶值,存储型属性的值不能够处于三个茫然的状态。可以在构造器中为存款和储蓄型属性赋初值,也能够在概念属性时为其安装暗许值。

注意:为存款和储蓄型属性设置值时,它们的值时被直接设置的,不会接触任何性质观测器(property observer)

同样如下代码也能够团结为dynamic随意钦定属性:

1. 构造器

构造器在开立某一定类型的新实例时调用,它的最简情势类似于四个不带任何参数的实例方法,以第三字init命名。

下边大家看2个事例。

class JJPracticeVC: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()

        view.backgroundColor = UIColor.lightGray

        var f = Fahrenheit()
        print("temperature is \(f.temperature)")
    }
}

struct Fahrenheit {
    var temperature : Double
    init() {
        temperature = 32.0
    }
}

上边看输出结果

temperature is 32.0

以此结构体定义了二个不带参数的构造器init,并在里头将存储型属性temperature的值起首化为32.0

1 dynamic data= null;
2 data= SqlDataHelper.GetWebDMDynamicData(sql, new { Id = id }).ToList().FirstOrDefault();
3 data.a= 124;
4 data.b= "test2";
5 data.c="test3";

贰. 暗中认可属性值

①旦3个性质总是利用同1个开头值,可认为其设置四个暗许值,无论定义暗许值依然在构造器中赋值,最后它们实现的法力是同等的,只不过默认值将品质的发轫化和个性的评释结合的更严格,使用暗许值能让您的构造器更轻易和更清晰。

你能够运用更简约的格局在概念结构体Fahrenheit时为属性temperature安装暗中认可值,具体如下代码所示。

struct Fahrenheit {
    var temperature : 32.0
}

可以为dynamic类型data随意钦命属性,前提条件是在第(2)步骤时data的值不能为空,不然在第(三)步data是null,那时候就能够现出空格外.

定制化构造进程

您能够由此输入参数和可选属性类型来定制构造进度,也得以在构造进程中期维修改常量属性。

(2)、再议论一下轻量级的OLacrosseM框架,这一个框架英特网早就浸润了大气的就学资料,本人只是对品种中的使用体验做些归纳,不对之处迎接指正.

一. 构造函数

你能够在概念构造器时提供构造函数,为其提供定制化构造所需值的种类和名字。构造器参数的职能和语法跟函数和章程参数同样。

上边看三个简约例子。

class JJPracticeVC: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()

        view.backgroundColor = UIColor.lightGray
        let boillingPointOfWater = Celsuis(formFahrenheit: 212.0)
        let freezePointOfWater = Celsuis(fromKelvin: 273.15)
        print(boillingPointOfWater)
        print(freezePointOfWater)
    }
}

struct Celsuis {
    var temperatureInCelsuis : Double = 0.0
    init(formFahrenheit fahrenheit : Double) {
        temperatureInCelsuis = (fahrenheit - 32.0) / 1.0
    }

    init(fromKelvin kelvin : Double) {
        temperatureInCelsuis = kelvin - 273.15
    }
}

上面大家看结果输出

Celsuis(temperatureInCelsuis: 180.0)
Celsuis(temperatureInCelsuis: 0.0)

能够窥见,我们能够定义五个构造器,并且能够设置外部参数和中间参数,这里安装的是三个构造器。

       
大家清楚调用数据仓库储存款和储蓄进度鲜明有参数化,dapper提供了一个比较好的参数化对象DynamicParameters,上代码:

2. 其春天外部参数名

其实,这一个功用上个例子已经足以见到,在构造器中安装内部参数和表面参数。假设在概念构造器的时候从不提供参数的外表名字,swift会为种种构造器的参数自动生成二个和内部名字如出1辙的表面名,就也就是在种种组织参数在此之前加二个哈希符号。

class JJPracticeVC: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()

        view.backgroundColor = UIColor.lightGray

        let color = Color(red: 1.0, green: 1.0, blue: 1.0)
        print(color.red)
        print(color.green)
        print(color.blue)
    }
}

struct Color {
    var red = 0.0, green = 0.0, blue = 0.0
    init(red : Double, green : Double, blue : Double) {
        self.red = red
        self.green = green
        self.blue = blue
    }
}

下边看输出结果

1.0
1.0
1.0
DynamicParameters dynamicParameters = new DynamicParameters();
            dynamicParameters.Add("@p_Id1", id1, DbType.String);
            dynamicParameters.Add("@p_Id2", id2, DbType.Int32);
            dynamicParameters.Add("@p_dateTime", dateTime, DbType.DateTime);
            List<dynamic> info =  conn.Query<T>(storeProcedureName,dynamicParameters, null, true, null, CommandType.StoredProcedure) as List<T>;

三. 可选属性类型

假设你定制的品类涵盖几个逻辑上同意取值为空的存款和储蓄型属性,不管是因为它不恐怕在开端化时赋值,如故因为它能够在后来有个别时刻点能够赋值为空,你都需求将它定义为可选类型optional type,可选类型的习性将电动初叶化为空nil,表示那几个脾气是故目的在于初阶化时设置为空的。

看一下底下的事例。

class JJPracticeVC: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()

        view.backgroundColor = UIColor.lightGray

        let cheeseQuestion = SurveyQuestion(text: "Do you like me?")
        cheeseQuestion.ask()
        cheeseQuestion.response = "YES, I do!"
        print(cheeseQuestion.response)
    }
}

class SurveyQuestion{
    var text : String
    var response : String?
    init(text : String) {
        self.text = text
    }

    func ask(){
        print(text)
    }
}

下边看输出结果

Do you like me?
Optional("YES, I do!")

这里,response正是可选属性,当SurveyQuestion实例化时,它将机关赋值为空nil,证明目前不存在此字符串。

       
固然要内定实践存款和储蓄进程,那么要钦点CommandType.StoredProcedure关键字.

四. 组织进程中常量属性的改换

即便在组织进度截止前常量的值能明确,你能够在结构过程中的率性时间点修改常量属性的值,对某些类实例来讲,它的常量属性只幸亏概念它的类的组织进程中修改,不可能再子类中修改,上边看贰个例证。

class SurveyQuestion{
    let text : String
    var response : String?
    init(text : String) {
        self.text = text
    }

    func ask(){
        print(text)
    }
}

这里

 let text : String

概念了常量属性,并且在构造器中展开了改换。


 (三)、以下是List<T>转dataTable的方法,的确为类型转变省去了许多的代码,可是也有3个和好花了点时间未有消除的主题素材,就是T必须钦赐实体类型,而不能够应用dynamic,不然type.GetProperties

暗中认可构造器

swift为富有属性已提供默许值的且本身未有概念任何构造器的结构体或基类,提供三个暗许的构造器。下边大家在看一个事例。

class ShoppingList{
    var name : String?
    var quatity = 1
    var purchased = false
}

这里ShoppingList的具有属性都有暗中认可值,它将活动获取3个方可为富有属性设置私下认可值的默许构造器。

取不到精确的特性,那样系统就非得多定义贰个实体类传进来.

一. 结构体的顺序成员构造器

假若结构体对全部存款和储蓄型属性提供了私下认可值并且小编未有提供定制的构造器,它们能活动得到一个顺序成员构造器。看一下底下的粗略例子。

class JJPracticeVC: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()

        view.backgroundColor = UIColor.lightGray

        let size = Size(width: 2.0, height: 2.0)
    }
}

struct Size {
    var width = 0.0, height = 0.0
}

下面,Size是一个结构体,它富含两性情格widthheight,结构体自动获得二个逐项成员构造器init(width:height),可以为Size创办新的实例。


 public static DataTable ToDataTable<T>(IList<T> list)
        {
            //create propertyInfo
            List<PropertyInfo> pList = new List<PropertyInfo>();
            //get reflector interface
            Type type = typeof(T);
            DataTable dt = new DataTable();
            //add datatable column
            Array.ForEach<PropertyInfo>(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, Nullable.GetUnderlyingType(
            p.PropertyType) ?? p.PropertyType); });
            foreach (var item in list)
            {
                //create new row
                DataRow row = dt.NewRow();
                pList.ForEach(p => row[p.Name] = p.GetValue(item, null)??System.DBNull.Value);
                dt.Rows.Add(row);
            }
            return dt;
        }

值类型的构造器代理

构造器能够由此调用别的构造器来成功实例的片段结构进程,那一进程成为构造器代理,它能收缩三个结构器间的代码重复。

构造器代理的贯彻规则和款式在值类型和类品种中有所差异,值类型(结构体和枚举)不帮忙承接,所以构造器代理的经过相对简便易行,因为它们只好代理给本人提供的其余构造器,类则不相同,它能够持续自其余类,那意味类有权利保证其颇具继续的存款和储蓄型属性在构造时也能科学的开始化。

对于值类型,你能够行使self.init在自定义的构造器中援引别的的属于同一值类型的构造器,并且你只幸亏构造器内部选拔self.init在。

注意:倘使你为有些值类型定义了叁个定制构造器,你将不能访问到暗中认可构造器(倘诺是结构体,则不能访问注意对象构造器),幸免定义了定制的构造器,别人依旧荒谬的使用自动生成的构造器。

上面看二个例证。

struct Size {
    var width = 0.0, height = 0.0
}

struct Point {
    var x = 0.0, y = 0.0
}

struct Rect {
    var origin = Point()
    var size = Size()
    init() {

    }

    init(origin : Point, size : Size) {
        self.origin = origin
        self.size = size
    }

    init(center : Point, size : Size) {
        let originX = center.x - size.width * 0.5
        let originY = center.y - size.height * 0.5
        self.init(origin: Point(x : originX, y : originY), size: size)
    }
}

这里运用了多个构造器,如下:

  • 第5个构造器init(),在作用上根未有自定义构造器时自动得到的私下认可构造器是如出1辙的,大括号里什么都没做,调用那几个构造器就能够再次来到3个Rect实例,它的originsize品质都利用自定义的私下认可值Point(x
    = 0.0, y = 0.0)和Size (width = 0.0, height = 0.0)

上面大家调用一下

class JJPracticeVC: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()

        view.backgroundColor = UIColor.lightGray

        let basicRect = Rect()
        print(basicRect.origin)
        print(basicRect.size)
    }
}

上边看输出结果

Point(x: 0.0, y: 0.0)
Size(width: 0.0, height: 0.0)
  • 第二个Rect构造器init(origin : size : ),在职能上跟结构体在尚未自定义构造器时获得的壹10%员构造器是如出一辙的,那些构造器只是轻易的将originsize参数值赋值给相应的存款和储蓄型属性。

上面大家调用一下。

class JJPracticeVC: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()

        view.backgroundColor = UIColor.lightGray

        let originRect = Rect(origin: Point(x : 2.0, y : 2.0), size : Size(width: 5.0, height: 5.0))
        print(originRect.origin)
        print(originRect.size)

    }
}

上面看输出结果

Point(x: 2.0, y: 2.0)
Size(width: 5.0, height: 5.0)
  • 第三个Rect构造器init(center : size :),这些纷纷一点,先经过centersize计算origin坐标,然后调用或代理给init(origin : size : )布局器构造出新的originsize

上面大家调用一下。

class JJPracticeVC: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()

        view.backgroundColor = UIColor.lightGray

        let centerRect = Rect(center: Point(x : 4.0, y : 4.0), size: Size(width: 3.0, height: 3.0))
        print(centerRect.origin)
        print(centerRect.size)
    }
}

上边看一下出口结果

Point(x: 2.5, y: 2.5)
Size(width: 3.0, height: 3.0)

好了,以上正是项目中的一些纤维总计,还有部分零碎的知识点不做过多描述了.通过品种进程中还有许多要读书的技术,尤其是关系技艺,能力指引专门的学问技能.

后记

未完,待续~~~

4858.com 1

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有