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

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替换掉。

时间: 2024-08-07 04:31:56

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

WPF,Silverlight与XAML读书笔记第七 - WPF新概念之二依赖属性

说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘>的编排,对内容进行了总结并加入一些个人理解. WPF引入了一种新的属性类型 – 依赖属性.依赖属性用于整个WPF平台,用来实现样式化,自动属性绑定,动画等.详细说即使用属性替代方法和事件处理对象的行为,通过属性驱动来加强系统的行为.如将属性绑定到数据源来驱动用户界面的显示. 依赖属性可以发挥作用的场合如:将一个属性绑定到另一个对象的某属性,要求当被绑定的属性改变时,依赖于那个属性的属性会自动改变(

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

第11章 泛型算法 1.概述 泛型算法依赖于迭代器,而不是依赖容器,需要指定作用的区间,即[开始,结束),表示的区间,如上所示 此外还需要元素是可比的,如果元素本身是不可比的,那么可以自己定义比较函数. 2.常用的泛型算法函数: fill,fill_n, copy, replace, sort, unique, count_if, stable_sort 此外在有一个谓词函数会结合以上的函数使用,像sort, count_if等 3.再谈迭代器 (1)插入迭代器 back_inserter, f

《CLR via C#》读书笔记 之 泛型

第十二章 泛型 2014-06-15 初始泛型12.3 泛型基础结构  12.3.1 开放类型与封闭类型  12.3.2 泛型类型和继承  12.3.3 泛型类型同一性  12.3.4 代码爆炸参考 初始泛型[1][2] 返回 泛型(generic)是CLR和编程语言提供一种特殊机制,它支持另一种形式的代码重用,即"算法重用". 简单地说,开发人员先定义好一个算法,比如排序.搜索.交换等.但是定义算法的开发人员并不设定该算法要操作什么数据类型:该算法可广泛地应用于不同类型的对象.然后,

C++primer读书笔记9转换与类类型

有时候指定了自己类类型来表示某种类型数据如SmallInt,那么为了方便计算就会指定一个转换操作符,将该类类型在某种情况下自动的转换为指定的类型 <1>转换操作符 operator type(); 转换函数必须是类成员函数,不能指定返回类型,并且形参列表必须为空,并且通常不应该改变转换对象,所以操作符通常定义为const成员. #include <iostream> using namespace std; class SmallInt { public: SmallInt(int

《C#图解教程》读书笔记之二:存储、类型和变量

一.类型初窥:掀起你的盖头来 (1)C程序是一组函数和数据类型,C++程序是一组函数和类,而C#程序是一组类型声明: (2)类型是一种模板:模板本身不是数据结构,但它详细说明了由该模板构造的对象的特征: (3)C#提供了16种预定义类型:13种简单类型(数值类型:int,float,double,decimal等:非数值类型:bool,char),3种非简单类型(object,string,dynamic): 所有的预定义类型都直接映射到底层的.NET类型.C#的类型名称其实就是.NET类型的别

Java泛型读书笔记 (三)

泛型对于老代码的支持 Java的泛型设计成类型擦除的目的,很大一部分是为了兼容老老代码.如下的一段代码: void setLabelTable(Dictionary table) table的类型是非泛型的Dictionary,但是我们可以传入泛型的Dictionary: Dictionary<Integer, Component> labelTable = new Hashtable<>(); labelTable.put(0, new JLabel(new ImageIcon(

#读书笔记#Illustrated C# 2012第17章 Generics泛型(1)

什么是泛型(广泛意义上的"泛型")-->在特定语言(C#)里的泛型-->C#中的5个泛型类型 1.什么是泛型? 2.C#中提供了五种泛型(C#中的泛型) 3.C#中的泛型类(Generic Classes ) 4.泛型方法Generic Methods 5.泛型结构Generic Structs 6.泛型委托Generic Delegates 7.泛型接口Generic Interfaces ================= 1.什么是泛型 泛型是通过一种抽象的方式达到方

C#学习笔记三: C#2.0泛型 可控类型 匿名方法和迭代器

前言 C#1.0的委托特性使方法作为其他方法的参数来传递,而C#2.0 中提出的泛型特性则使类型可以被参数化,从而不必再为不同的类型提供特殊版本的实现方法.另外C#2.0还提出了可空类型,匿名方法和迭代器3个优美的特性. 1,泛型1.1 泛型是什么泛型的英文表述是"generic", 这个单词意为通用的.从字面意思可知,泛型代表的就是"通用类型",它可以代替任意的数据类型,使类型参数化,从而达到之实现一个方法就可以操作多种数据类型的目的.泛型是将方法实现行为与方法操

Java泛型Generic - Thinking in Java读书笔记

1.什么是泛型? 泛型就是可适用于很多的类,它实现了参数化类型type parameter的概念,参数化类型指可使用多种类型. 多态是一种泛化机制. 例如方法 A(Base b){}//Base是一个基类 这样方法A就可以接受从这个基类Base的任何子类作为参数.方法的参数也可以是一个接口,但是由于类的单继承体系和接口的约束( An interface still requires that your code works with that particular interface. ),不能