IsGenericType 如果类型为泛型,则返回 true。
GetGenericArguments

返回 Type 对象数组,这些对象表示为构造类型提供的类型变量,或泛型类型定义的类型参数。
如果是MyList<int,Person> ,则返回int和Person类型的数组,如同Type[] tpyes={typeof(int),typeof(Person)},Type数组中任一参数的IsGenericParameter为false;
如果是MyList<,>或,则返回T和U类型的数组,这时得到的Type数组中的任一参数的IsGenericParameter属性为true,因为MyList<T,U>是泛型类型的初始定义

GetGenericTypeDefinition

返回当前构造类型的基础泛型类型定义。
返回一个基础定义的Type,如MyList<T,U>,可以用来构造其他泛型类型定义。
Type t = typeof(Stack<>);
//获取基础泛型类型定义,即Stack<T>,这时可用defType定义其他的泛型类型,比如Stack<Person>
Type defType = t.GetGenericTypeDefinition();

if(defType.IsGenericTypeDefinition) {
Type dType = defType.MakeGenericType(typeof(Person));
Console.WriteLine(dType.IsGenericTypeDefinition);
}

GetGenericParameterConstraints

如果泛型类型的类型参数T有参数约束,且这些约束参数是自定义的类型(如Person)或其他可以用来实例化对象的类型,不是class、struct等关键字的话,则可用该方法获取这些参数约束的类型。该方法会返回一个Type数组。
如:
//这个会返回Type[] type={typeof(Person)}
public class Stack<T> where T:Person {}

//这个返回的Type数组的length为0
public class Stack<t> where T:class{}

ContainsGenericParameters

如果类型或其任意封闭类型或方法包含没有被提供特定类型的类型参数,则返回 true。
即:
//提供了特定类型参数Person
Type t = typeof(Stack<Person>);
//返回false
Console.WriteLine(t.ContainsGenericParameters);

//没有提供特定类型参数
Type t = typeof(Stack<>);
//返回true
Console.WriteLine(t.ContainsGenericParameters);

GenericParameterAttributes 获取 GenericParameterAttributes 标志的组合,这些标志描述当前泛型类型参数的特殊约束。如class、new()等
GenericParameterPosition

对于表示类型参数的 Type 对象,获取类型参数在声明该类型参数的泛型类型定义或泛型方法定义的类型参数列表中的位置。
如果IsGenericParameter为false,表明用于typeof的Stack泛型的类型参数是特定的,不是原生的T,这时不能使用GenericParameterPosition属性,会抛出异常;如果IsGenericParameter为true,才能使用GenericParameterPosition属性。
//首先通过GetGenericArguments方法获取,如:
Type t = typeof(Stack<>);
Type[] types = t.GetGenericArguments();
//其次可用foreach循环。如果是typeof(Stack<Person>)这种情况,t1.IsGenericParameter会为false,这时不能使用t1.GenericParameterPosition属性,否则会抛出异常。
foreach(Type t1 in types) {
Console.WriteLine(t1.Name + " " + t1.IsGenericParameter + " "+t1.GenericParameterPosition);
}

IsGenericParameter

获取一个值,该值指示当前 Type 是表示泛型类型定义的类型参数,还是泛型方法定义的类型参数。
如果typeof的是原生的泛型类(例如Type type=typeof(Stack<>);),则IsGenericParameter为true,否则为false

IsGenericTypeDefinition

获取一个值,该值指示当前 Type 是否表示可以用来构造其他泛型类型的泛型类型定义。 如果类型表示泛型类型的定义,则返回 true。
我的理解是,是否为原生的泛型类型定义,即是否为这样的形式定义的Type:
Type type=typeof(Stack<>);
如果是,则返回true,否则返回false。因为定义的type,才是原生的泛型类型,才能通过以下代码去定义特定类型的泛型类:
if(type.IsGenericTypeDefinition) {
//dType如同Type dtype=typeof(Stack<Person>);
Type dType = type.MakeGenericType(typeof(Person));
}

DeclaringMethod 返回定义当前泛型类型参数的泛型方法;如果类型参数不是由泛型方法定义的,则返回空值。
MakeGenericType 用类型数组的元素替代当前泛型类型定义的类型参数,并返回表示结果构造类型的 Type 对象。

发现一个有趣的现象,如果属性中包含Generic字眼的,多数都是指明Type为typeof的原生泛型类,及Type type=typeof(Stack<>);这种形式,原生的也称为基础的泛型类型可以用来定义特定类型的其他泛型类,即用可以实例化对象的类型将T替换掉。

读书笔记 C# Type类型与泛型有关的某些属性浅析的更多相关文章

  1. 【记】《.net之美》之读书笔记(二) C#中的泛型

    前言 上一篇读书笔记,很多小伙伴说这本书很不错,所以趁着国庆假期,继续我的读书之旅,来跟随书中作者一起温习并掌握第二章的内容吧. 一.理解泛型 1.为什么要使用泛型?-----通过使用泛型,可以极大地 ...

  2. HTML(七)HTML 表单(form元素介绍,input元素的常用type类型,input元素的常用属性)

    前言 表单是网页与用户的交互工具,由一个<form>元素作为容器构成,封装其他任何数量的表单控件,还有其他任何<body>元素里可用的标签 表单能够包含<input> ...

  3. 《CLR via C#》读书笔记--基元类型、引用类型和值类型

    编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...

  4. Effective Java 读书笔记(四):泛型

    1 不要使用原始类型 (1)术语 术语 例子 参数化类型(Parameterized type) List<String> 实际类型参数(Actual type parameter) St ...

  5. CLR via C#读书笔记二:类型基础

    1.CLR允许将对象转换为它的(实际)类型或者它的任何基类型. 2.is操作符检测对象是否兼容于指定类型,is操作符永远不抛出异常. 3.as操作符返回对同一个对象的非null引用.如果对象不兼容,a ...

  6. C++ Primer 读书笔记:第11章 泛型算法

    第11章 泛型算法 1.概述 泛型算法依赖于迭代器,而不是依赖容器,需要指定作用的区间,即[开始,结束),表示的区间,如上所示 此外还需要元素是可比的,如果元素本身是不可比的,那么可以自己定义比较函数 ...

  7. 《JavaScript高级程序设计》读书笔记 ---基本包装类型

    为了便于操作基本类型值,ECMAScript 还提供了3 个特殊的引用类型:Boolean.Number 和String.这些类型与本章介绍的其他引用类型相似,但同时也具有与各自的基本类型相应的特殊行 ...

  8. 【读书笔记】iOS-强类型与弱类型

    id类型是一个通用类型,OC使用id表示任意类型的对象,它可以作为一个占位符表示这是一个不确定的类型的对象或者引用.因此,所有的对象都 可以用id来表示.这很有用,想象一下,如果你需要实现一个通用的链 ...

  9. 2019.03.21 读书笔记 基元类型的Parse与TryParse 性能与建议

    Parse转换失败时会抛出异常,耗损性能,如果转换成功,则与TryParse无差异.查看源码,tryparse的代码更多一些,在失败时,反而性能更优,主要是抛出异常耗损了性能.所以在不确定是用Tryp ...

随机推荐

  1. R quantile函数 | cut函数 | sample函数 | all函数 | scale函数 | do.call函数

    取出一个数字序列中的百分位数 1. 求某一个百分比 x<-rnorm(200) quantile(x,0.9) 2. 求一系列的百分比 quantile(x,c(0.1,0.9)) quanti ...

  2. 一个不该写的bat

    新建bat文件,放到D盘根目录 %0|%0 进入到C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Program ...

  3. Linux 文本编辑器 vim

    第五讲 文本编辑器 vim

  4. MySQL之库表详细操作

    一 库操作 1.创建数据库 1.1 语法 CREATE DATABASE 数据库名 charset utf8; 1.2 数据库命名规则 可以由字母.数字.下划线.@.#.$ 区分大小写 唯一性 不能使 ...

  5. Vladik and cards CodeForces - 743E (状压)

    大意: 给定序列, 求选出一个最长的子序列, 使得任选两个[1,8]的数字, 在子序列中的出现次数差不超过1, 且子序列中相同数字连续. 正解是状压dp, 先二分转为判断[1,8]出现次数>=x ...

  6. python记录_day07

    一.基本数据类型补充 1.列表的拼接用join()方法 li = ["hello","world"] s = "_".join(li) pr ...

  7. centos7 --kubeadm安装

    One or more machines running one of: Ubuntu 16.04+ Debian 9 CentOS 7 RHEL 7 Fedora 25/26 (best-effor ...

  8. consul总结

    一.介绍 内置了服务注册与发现框 架.分布一致性协议实现.健康检查.Key/Value存储.多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)服务部署简单,只有一个可运行的二进制的包.每 ...

  9. php调用oracle存储

    //todo 调用oracle 存储$config = //数据库配置文件 里面包含 用户密码和host和端口以及dbname $conn = oci_connect($config['usernam ...

  10. Maven插件系列之spring-boot-maven-plugin

    Spring Boot的Maven插件(Spring Boot Maven plugin)能够以Maven的方式为应用提供Spring Boot的支持,即为Spring Boot应用提供了执行Mave ...