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号