泛型

C# model转Dto 使用泛型即可实现

流过昼夜 提交于 2019-12-26 04:42:28
C# model转Dto 使用泛型即可实现 using System ; using System . Collections . Generic ; using System . Linq ; using System . Reflection ; using System . Text ; using System . Threading . Tasks ; namespace GlobalAPI { public class PropertyHelper { /// <summary> /// 反射得到实体类的字段名称和值 /// var dict = GetProperties(model); /// </summary> /// <typeparam name="T">实体类</typeparam> /// <param name="t">实例化</param> /// <returns></returns> public static Dictionary < object , object > GetProperties < T > ( T t ) { var ret = new Dictionary < object , object > ( ) ; if ( t == null ) { return null ; } PropertyInfo [ ]

DotNet进阶系列

ぃ、小莉子 提交于 2019-12-25 22:36:50
一. 回顾历史    回顾个人发展历程,自2012年初次接触开发至今(2018年)已经有六个年头,这期间陆陆续续学习并掌握了不少技术,C#语言、ORM框架、多线程技术、设计模式、前端技术、MVC、MVVM框架思想等等,每种技术随着多次使用,随着不断的反思,逐渐经历 “了解→理解→掌握→精通 ”这么一个过程,从最初的只能实现功能到如今的“每一步都考虑性能优化问题”,在近两年内,开始写博客,最初只是一时兴起,想让百度上能搜索出我的文章,但现在已经形成一个习惯,在没有特殊事情耽搁的情况下,坚持一周两篇博客,到目前为止,有效文章数已经达到140多篇,当然后面还会陆续写下去。   作为理科生出身的我,没有华丽的辞藻 ,没有煽情篇章,话不多说,回顾完个人开发历程,下面看一下C#和.Net的发展历程,再次补充一点,.Net不是一门开发语言,而C#才是基于.Net运行环境下的一种高级开发语言。      从上面的表格可以看出来,C#这么语言至今已经接近20年历史了,从2002年诞生的那一刻起,不断更新,不断改进,功能越来越强大,越来越方便程序们的开发,当然.NET类库、CLR、以及开发神器Visual Studio也在不端更新。( VS 2017 宇宙第一开发神器 这个应该毫无争议吧 )   之前曾说过,C#仅仅是.Net下的一门开发语言而已,.Net生态远远不止如此。       我们以前提到

asp.net abp模块化开发之通用树2:设计思路及源码解析

断了今生、忘了曾经 提交于 2019-12-25 22:09:29
一、前言 上一篇大概说了下abp通用树形模块如何使用,本篇主要分析下设计思路。 日常开发中会用到很多树状结构的数据,比如:产品的多级分类、省市区县,大多数系统也会用到类似“通用字典/数据字典”的功能,为系统各个地方提下拉框选择的数据源。abp提供了一个模块化系统,只要按它的约定就可以实现一个通用的树形数据的模块,这样公司的多个系统都可以使用,也可以用类似nuget的方式提供给别人使用。 先列举下它的功能 通过nuget方便安装和升级 配置简单 默认已经提供“通用字典”功能 实体、管理器、应用服务都是抽象类,结合泛型 狠容易扩展实现自己的树形结构 二、必备知识 这不是abp入门级的文章,是探讨系统模块化开发的一种思路。所以要求对abp有经验,完整看过abp文档,对涉及到的模块、依赖注入、启动配置、权限、菜单、本地化等等概念有清晰的认识 三、包和源码 源码地址: https://github.com/bxjg1987/abpGeneralModules nuget:Install-Package BXJG.GeneralTree -Version 1.0.2 在线地址: http://test.cqsifang.com/ 账号密码:admin zlj.com (别胡来,拜托...) 源码仓库中还有通用的文件模块、附件模块,后期会讲讲;nuget搜索bxjg可以找到这几个相关的包 四

Essential c++初学 第三章 basic c++ programming

谁说我不能喝 提交于 2019-12-25 19:53:42
泛型编程 1.指针的算术运算 为了操作容器中的数据而不用管它的数据类型是什么,使用泛型(generic)算法,不直接在容器身上进行操作,而是借用一对iterator,标识我们要进行迭代的范围。 1.对于array来说,传入array而不管array里面是什么 //写出template泛型 find()函数 template < typename T > T * find ( T * first , T * last , const T & value ) { if ( ! first || ! last ) return 0 ; for ( ; first != last ; ++ first ) { if ( * first == value ) return first ; //输出所查找元素的地址 } return 0 ; } int main ( ) { int ia [ 8 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 } ; int * pi = find ( ia , ia + 8 , ia [ 3 ] ) ; //find()返回所查找元素的地址 } 2.传入vector而不管vector里面是什么 # include <vector> # include <iostream> //编写泛型find函数 template <

Java 泛型 PECS

眉间皱痕 提交于 2019-12-25 11:52:26
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 最近在研究框架的源码,发现有好多代码中使用了很多泛型了的用法<? extends>和<? super>。以前看《Java编程思想》的时候也有所了解,但是具体不是很清楚,所以写了这篇博客分享一下。其实这写用法可以叫做Java泛型PECS法则。 一、什么是PECS: PECS指“Producer Extends Consumer Super”如果参数化类型表示一个生产者就使用<? extends T>, 如果它表示一个消费者就使用<? super T>。 下面举例说明: 1. 生产者: 有一个List<Producer> producerList, 如果我们只从这个producerList中读取数据,而不从中添加数据,那这个List就称为Producer,即生产者。 2.消费者: 如果我们只向一个List<Consumer> consumer中添加数据,则这样的List就被称为Consumer,即消费者。 二、PECS的用法: 1.生产者的用法: 定义numList: List<? extends Number> numList = new ArrayList<Number>(); <? extends Number>表示最高父类是Number类型,Integer, Double都属于Number的子类

C# 泛型的协变和逆变

≡放荡痞女 提交于 2019-12-25 11:00:33
1. 可变性的类型:协变性和逆变性 可变性是以一种类型安全的方式,将一个对象当做另一个对象来使用。如果不能将一个类型替换为另一个类型,那么这个类型就称之为: 不变量 。协变和逆变是两个相互对立的概念: 如果某个返回的类型可以由其派生类型替换,那么这个类型就是支持 协变 的 如果某个参数类型可以由其基类替换,那么这个类型就是支持 逆变 的。 2. C# 4.0对泛型可变性的支持 在C# 4.0之前,所有的泛型类型都是 不变量 ——即不支持将一个泛型类型替换为另一个泛型类型,即使它们之间拥有继承关系,简而言之,在C# 4.0之前的泛型都是不支持协变和逆变的。 C# 4.0通过两个关键字: out 和 in 来分别支持以协变和逆变的方式使用泛型。 我们来看一段利用了 协变 类型参数的代码: public class BaseClass { //... } public class DerivedClass : BaseClass { //... } 下面我们利用协变类型参数,可以执行类似于普通的多态性的分配: IEnumerable<DerivedClass> d = new List<DerivedClass>(); IEnumerable<BaseClass> b = d; 在上面的实例中,在C# 4.0之前是不能正常编译的,除了对赋值给基类集合时将子类集合做一个强制转换

Collection体系、遍历、泛型

情到浓时终转凉″ 提交于 2019-12-25 05:57:24
Collection体系(集合类,它是一个接口): 两个子类: List、Set(这两个子类也是接口) List有两个常用子类:(值,不唯一,允许有重复的元素,都是有序的) ArrayList: 数组结构,查找快,增删慢。线程不安全。 LinkedList: 有序,链表结构,查找慢,增删快。线程不安全。 Vector:(以过时) 有序,数组结构,查找增删都慢。线程安全。 Set:有三个常用子类(值,唯一,不允许有重复的元素) HashSet: 底层是哈希表结构,无序。 如何保证唯一性的? 由HashCode和equals方法保证唯一性的。 顺序: 先判断HashCode方法 相同:判断equals方法,相同:不添加。不相同:添加 不相同:添加 LinkedHashSet: 有序,底层是链表加哈希表结构,由链表保证有序,哈希表保证唯一。 TreeSet: 底层是二叉树结构,有一定的自然排序算法。 是如何保证元素的唯一性的? 根据返回值是否是0判断是否重复。并且还要保证元素有序: 根据返回值是正数还是负数。 实现方案:添加比较器 元素具备比较器:实现Comparable接口,重写CompareTo方法。 集合具备比较器:实现Comparator接口,重写Compare方法。 List和Set集合遍历的几种方式: Set集合是没有普通for的遍历方式 普通for、增强for、迭代器

泛型真的会降低性能吗?

被刻印的时光 ゝ 提交于 2019-12-25 03:50:20
在《 .NET,你忘记了么?(八)—— 从dynamic到特性误用 》一文中, 飞林沙 同学提到,使用泛型会略微降低程序性能,因此在程序中使用List<Object>是不合理的行为,应该使用ArrayList。这一点和老赵平时的观点相悖,老赵一直提倡,在.NET 2.0之后,要尽可能使用List<T>,情愿是List<Object>也不要使用ArrayList。不过个中原因与性能无关,我们稍候再叙述。飞同学的文章让我有了将泛型与非泛型进行性能比较的想法。这个比较非常容易,不过也得出了一些非常有意思的结论。 泛型容器与非泛型容器的性能比较 首先,我们来比较一种最“纯粹”的泛型容器,它的目的是避免程序的其他方面对性能的影响。因此,这里我们构造两个最简单的容器,就是简单的模仿ArrayList和List<T>: public class MyArrayList { public MyArrayList(int length) { this.m_items = new object[length]; } public object[] m_items; public object this[int index] { get { return this.m_items[index]; } set { this.m_items[index] = value; } } public

TypeScript Generics(泛型)

旧街凉风 提交于 2019-12-25 03:21:55
软件工程的一个主要部分就是构建组件,构建的组件不仅需要具有明确的定义和统一的接口,同时也需要组件可复用。支持现有的数据类型和将来添加的数据类型的组件为大型软件系统的开发过程提供很好的灵活性。 在C#和Java中,可以使用"泛型"来创建可复用的组件,并且组件可支持多种数据类型。这样便可以让用户根据自己的数据类型来使用组件。 泛型的简单案例 首先,用泛型写一个"Hello World":identity函数。identity函数将会返回我们传入的数据。你可以认为它是个"echo"命令。 不用泛型,我们也不用给identity函数指定类型: function identity(arg: number): number { return arg; } 或者,我们可以给identity函数指定"any"类型: function identity(arg: any): any { return arg; } 虽然使用"any"类型的时候可以接收任何类型的"arg"参数,但是实际上已经失去函数返回值类型的信息。假如我们传入一个number,我们只知道返回任何类型的值都是可以的。 所以,我们需要一直方式来捕捉参数的类型,也可以用它来表示返回值的类型。这里使用的是"类型变量",一种特殊的变量,代表的是类型而非值。 function identity<T>(arg: T): T { return

TypeScript 泛型

强颜欢笑 提交于 2019-12-24 23:42:59
⒈介绍   软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。泛型可用于提升代码的重用性,我们希望自己编写的代码,无论是模块还是组件,不仅能支持当前设计的数据类型,而且也能支持将来的数据类型,这在大型系统中是非常基础且重要的功能。所以我们常常能在各种各样的静态类型的语言中看到泛型设计,使用 泛型 来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。 ⒉泛型函数   我们创建一个hello函数,这个函数直接让传入的参数作为返回值return。   假设一个不使用泛型的函数会是什么样子?   如果传入参数是数字的话,它是这样的 function hello(arg:number) :number{ return arg; }   当我们的需求变成字符串时,它是这样的 function hello(arg:string) :string{ return arg; }   当然我们也可以使用any类型来表达这种混沌感 function hello(arg:any) :any{ return arg; }   但any类型并不能准确的表达返回值与参数必须是相同类型,因为any代表任何类型,这使得我们的类型表达开始混乱了。   因此,我们需要一种表达方式来控制函数的参数类型,这就要用到泛型了。