1
using System;2
using System.Collections.Generic;3
using System.Text;4

5
namespace ConsoleApplication16


{7

/**//// <summary>8
/// Refere ninputer's blog9
/// </summary>10
class Class211

{12

private class myType<t>
{ }13
delegate void DelegateType();14

15

16

17

18
static void Main()19

{20

/**//*21
* 获得一个封闭构造类型(closed constructed type)的Type对象?22
* 假设有类型: private class myType<t> { }23
*/24
Console.WriteLine(typeof(myType<>).ToString());25

/**//*26
* 如何从构造类型的Type对象生成泛型类型的Type对象?27
* Type类的新增方法GetGenericTypeDefinition可以做到。28
*/29
DelegateType delegateInstance = delegate()30

{31
Type cy = typeof(List<int>);32
Type gy = cy.GetGenericTypeDefinition();33
Console.WriteLine(gy.ToString());34
};35

36

/**//*如何获取类型参数的Type对象?37
*泛型类型的T, U等类型参数,以及运行中的实际取值,都是可以从Type对象获取的 38
*/39
delegateInstance += delegate()40

{41
Type cy = typeof(List<int>);42
Type[] gy=cy.GetGenericArguments();43
for (int i = 0; i < gy.Length; i++)44

{45
Console.WriteLine(gy[i].ToString());46
} 47
};48

/**//*从泛型类型Type对象生成构造类型的Type对象。49
*通常可以用来从一种构造类型生成另一种构造类型50
*/51
delegateInstance += delegate()52

{53
Type cy = typeof(List<int>);54
Type gy = cy.GetGenericTypeDefinition();55

56
Type ny = gy.MakeGenericType(typeof(string));57
Console.WriteLine(ny.ToString());58
};59

/**//*60
* 如何取一个开放构造类型(open constructed type)的Type对象?61
* 开放构造类型是最难处理的一个,因为他们的类型参数已经指定,但没有指定为具体类型,62
* 而是指定为其他泛型类型的类型参数。这种类型在进行反射重载选取以及反射发出(Reflection Emit)63
* 操作的时候尤为重要。我们的手法就是,先从宿主泛型类型的定义中获取类型参数的类型,然后再建造出开64
* 放构造类型。这里,我们获得List<T>的构造函数的参数,IEnumerable<T>的类型,注意这里的T是List<T>所定义的,65
* 而不是泛型IEnumerable<T>自己的类型参数66
*/67
delegateInstance += delegate()68

{69
Type cy=typeof(List<>);70
Type typeParm1 = cy.GetGenericArguments()[0];71
Type tienum = typeof(IEnumerable<>);72

73
74
Type tienumOpen = tienum.MakeGenericType(typeParm1);75

76
// 只有用这种方法获得开放构造类型77
//你才能用这个语法获得真正想要的构造函数定义78
//因为构造函数定义里IEnumerable(Of T)是一个开放构造类型79

System.Reflection.ConstructorInfo c=cy.GetConstructor(new Type[]
{tienumOpen});80
Console.WriteLine(c.ToString());81

82
};83
84

85
delegateInstance.Invoke();86
Console.Read();87
}88

89
}90
}91

浙公网安备 33010602011771号