如何用反射调用泛型类的方法
例子一:泛型类不含构造函数
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)}"); } }
本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/keeplearningandsharing/p/18500030