zoukankan      html  css  js  c++  java
  • 使用C#反射中的MakeGenericType函数,来为泛型方法和泛型类指定(泛型的)类型

    using System;
    using System.Reflection;
    
    namespace RFTest
    {
        //类ReflectionTest中定义了一个泛型函数DisplayType和泛型类MyGenericClass
        class ReflectionTest
        {
            //泛型类MyGenericClass有个静态函数DisplayNestedType
            public class MyGenericClass<T>
            {
                public static void DisplayNestedType()
                {
                    Console.WriteLine(typeof(T).ToString());
                }
            }
    
            public void DisplayType<T>()
            {
                Console.WriteLine(typeof(T).ToString());
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                ReflectionTest rt = new ReflectionTest();
    
                MethodInfo mi = rt.GetType().GetMethod("DisplayType");//先获取到DisplayType<T>的MethodInfo反射对象
                mi.MakeGenericMethod(new Type[] { typeof(string) }).Invoke(rt, null);//然后使用MethodInfo反射对象调用ReflectionTest类的DisplayType<T>方法,这时要使用MethodInfo的MakeGenericMethod函数指定函数DisplayType<T>的泛型类型T
    
                Type myGenericClassType = rt.GetType().GetNestedType("MyGenericClass`1");//这里获取MyGenericClass<T>的Type对象,注意GetNestedType方法的参数要用MyGenericClass`1这种格式才能获得MyGenericClass<T>的Type对象
                myGenericClassType.MakeGenericType(new Type[] { typeof(float) }).GetMethod("DisplayNestedType", BindingFlags.Static | BindingFlags.Public).Invoke(null, null);
                //然后用Type对象的MakeGenericType函数为泛型类MyGenericClass<T>指定泛型T的类型,比如上面我们就用MakeGenericType函数将MyGenericClass<T>指定为了MyGenericClass<float>,然后继续用反射调用MyGenericClass<T>的DisplayNestedType静态方法
    
                Console.ReadLine();
            }
        }
    }
  • 相关阅读:
    1059 C语言竞赛
    1058 选择题
    1057 数零壹
    1056 组合数的和
    1055 集体照
    Mysql--分库分表
    Mysql--改表结构
    Mysql--开始阶段
    Mysql--常用语句
    Mysql--grant授权
  • 原文地址:https://www.cnblogs.com/sjqq/p/9634517.html
Copyright © 2011-2022 走看看