Code
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace ConsoleApplication1
6{
7 /**//// <summary>
8 /// Refere ninputer's blog
9 /// </summary>
10 class Class2
11 {
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
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace ConsoleApplication1
6{
7 /**//// <summary>
8 /// Refere ninputer's blog
9 /// </summary>
10 class Class2
11 {
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