如何用反射调用泛型类的方法

例子一:泛型类不含构造函数

using System;
using System.Reflection;

namespace 使用反射调用泛型类的方法
{
    class Program
    {
        static void Main(string[] args)
        {
            //定义要使用的类型参数(就是调用方法时要传入的参数类型,例如int)
            Type genericTypeArgument = typeof(int);

            //获取泛型类的定义
            Type generciClassType = typeof(GenericClass<>);

            //创建具体的泛型类型
            Type specificGenericType = generciClassType.MakeGenericType(genericTypeArgument);

            //使用反射创建泛型类的实例
            object instance = Activator.CreateInstance(specificGenericType);

            //获取方法信息
            MethodInfo methodInfo = specificGenericType.GetMethod("DoSomething");

            //准备方法参数
            object[] parameters = new object[] { 42 };

            //调用方法
            methodInfo.Invoke(instance, parameters);
            Console.ReadKey();
        }
    }

    public class GenericClass<T>
    {
        public void DoSomething(T value)
        {
            Console.WriteLine($"Do something with {value} of type {typeof(T)}");
        }
    }
}

测试结果如下:

 

例子二,泛型类含有构造函数的情况

 //例子2:泛型类含有构造函数

    class Program
    {
        static void Main(string[] args)
        {
            // 1. 定义要使用的类型参数
            Type genericTypeArgument = typeof(int);
            // 2. 获取泛型类的定义
            Type genericClassType = typeof(GenericClass<>);
            // 3. 创建具体的泛型类型
            Type specificGenericType = genericClassType.MakeGenericType(genericTypeArgument);


            //写法一:
            //4.1 获取构造函数信息
            //ConstructorInfo constructorInfo = specificGenericType.GetConstructor(new[] { genericTypeArgument });
            //4.2 使用反射创建泛型类的实例
            //object instance = constructorInfo.Invoke(new object[] { 42 });

            //写法二:
            // 4. 使用 Activator.CreateInstance 创建泛型类的实例
            object instance = Activator.CreateInstance(specificGenericType, new object[] { 42 });

            //5. 获取方法信息
            MethodInfo methodInfo = specificGenericType.GetMethod("DoSomething");
            // 6. 调用方法
            methodInfo.Invoke(instance, null);
            Console.ReadKey();
        }
    }

    public class GenericClass<T>
    {
        private T _value;
        public GenericClass(T value)
        {
            _value = value;
        }
        public void DoSomething()
        {
            Console.WriteLine($"Do something with {_value} of type {typeof(T)}");
        }
    }

 

posted @ 2024-10-24 17:41  katesharing  阅读(6)  评论(0编辑  收藏  举报