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. sql server 我常用的语句

    1. computed column ) persisted; 2. unique nullable create unique nonclustered index[UniqueName] on [ ...

  2. (转)C# 构造函数与析构函数

    (1)构造函数<1>除非是static,否则编译器将会给每一个没有构造函数的类指定一个默认的构造函数<2>构造函数private时候,类不能被实例化<3>派生类可以 ...

  3. 20165303 2017-2018-2 《Java程序设计》结对编程练习_四则运算

    需求分析 能生成简单四则运算题目并判断用户回答对错. 能正确统计回答正确的概率. 能正确处理混合四则运算的优先级的问题. 能正确输出负数等结果. 能处理简单的加,减,乘,除运算. 能正确的处理有括号的 ...

  4. Spring Cloud之配置中心搭建

    一.配置中心服务端搭建 1)引入相关Maven坐标 <dependency> <groupId>org.springframework.cloud</groupId> ...

  5. Java -------- 首字母相关排序总结

    Java 字符串数组首字母排序 字符串数组按首字母排序:(区分大小写) String[] strings = new String[]{"ba","aa",&q ...

  6. stock 基本操作

    追涨停   量比 大于5      0%-2%   个股    2点卖     37分钟买   板块5 -8 只涨停    板块分向标   追踪短期个股的涨跌现象    明白市场大级别趋势     主 ...

  7. NestedScrollView嵌套ListView时只显示一行的解决方法

    在使用CoordinatorLayout和AppBarLayout实现嵌套滑动的时候,出现listview没有嵌套滑动: 如果要实现嵌套滑动,则需要添加NestedScrollView,但是结果发现l ...

  8. bzoj4804: 欧拉心算 欧拉筛

    题意:求\(\sum_{i=1}^n\sum_{j=1}^n\phi(gcd(i,j))\) 题解:\(\sum_{i==1}^n\sum_{j=1}^n\sum_{d=1}^n[gcd(i,j)== ...

  9. python-django rest framework框架之序列化

    序列化与反序列化: 对象 -> 字符串 序列化 字符串 -> 对象 反序列化 rest framework序列化+Form 目的: 解决QuerySet序列化问题 功能:解析 和 过滤 - ...

  10. 局域网两台机器ping超时

    在防火墙的高级设置中的入站规则里,找icmpv4 ,我的两条电脑都是无线连的,看你的无线是专用还是公用,开启对应的规则. windows默认是关闭的,我的系统前些天刚重置过,ping超时,还是要手动开 ...