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. MySQL中如何建立主从复制

    ## 1 概述 ## MySQL内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves) ...

  2. 最短路径遍历所有的节点 Shortest Path Visiting All Nodes

    2018-10-06 22:04:38 问题描述: 问题求解: 本题要求是求遍历所有节点的最短路径,由于本题中是没有要求一个节点只能访问一次的,也就是说可以访问一个节点多次,但是如果表征两次节点状态呢 ...

  3. FireFox(火狐)浏览器的相关问题

    如何加快FireFox(火狐)浏览器浏览网页速度 大部分网页加载缓慢的原因:1.宽带连接.网速不稳定2.浏览器本身问题,如果多开窗口浏览会占大量内存,而且磁盘空间没有做过优化,就这样电脑资源不够用,也 ...

  4. BroadcastReceiver(广播)的静态注册和动态注册 --Android开发

    BroadcastReceiver是安卓四大组件之一,本例通过代码的方式演示静态注册和动态注册. 1.静态注册 静态注册只需要AndroidManifest.xml中进行配置: AndroidMani ...

  5. LeetCode--496--下一个更大元素I(java)

    给定两个没有重复元素的数组 nums1和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更大 ...

  6. php数组的逐行写入文件与读取

    <?php /** * * 对数组$arr1=['Apple Orange Banana Strawberry'] 写入文件,并读取 **/ class IoFile { private $pa ...

  7. linux中的软、硬链接

    linux中的软.硬链接 硬链接 硬链接(hard link),如果文件B是文件A的硬链接,则A的inode节点号与B的inode节点号相同,即一个inode节点对应两个不同的文件名,两个文件名指向同 ...

  8. 『TensorFlow』高级高维切片gather_nd

    gather用于高级切片,有关官方文档的介绍,关于维度的说明很是费解,示例也不太直观,这里给出我的解读,示例见下面,     indices = [[0, 0], [1, 1]]    params ...

  9. 有一个问题关于stl函数中的算法问题

    是不是stl中的算法函数中参数只要是和函数相关的就是函数对象和谓词?

  10. java把13位时间戳转换成"yyyy-MM-dd HH:mm:ss"格式,工具类

    public static void main(String[] args) { String time = System.currentTimeMillis();//获取当前时间精确到毫秒级的时间戳 ...