反射调用泛型

Posted hyhy904

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射调用泛型相关的知识,希望对你有一定的参考价值。

class GenClass<T>

public void Note(T t)

Console.WriteLine(t);


调用

var ass = Assembly.Load("TextCord");
//反射调用泛型
var type_q = ass.GetType("TextCord.GenClass`1");
var typeMake = type_q.MakeGenericType(new Type[] typeof(string) );
var genclass = Activator.CreateInstance(typeMake);
var note = typeMake.GetMethod("Note",new Type[] typeof(string));
note.Invoke(genclass, new object[] "3333");
这里有几个重要的部分

我们在获取这个泛型的时候后面跟一些字符"`1",那么这个是什么意思呢?其实这个就是我们编译代码成il的时候,系统指定的一个类似占位符的东西,一般来说一个参数就是"`1",TClass<T,U>两个就是"`2"。

第二个注意的地方就是,我们初始化这个T的时候需要调用一下MakeGenericType(http://www.amjmh.com/v/BIBRGZ_558768/)方法,用于初始化类型T,就好像我们new一样

//如同这样
var genClass = new GenClass<string>();
第三个主要的就是,我们动态调用方法,我们一般在CreateInstance的时候就是创建反射对象的实例,通过强转或者使用动态类型调用方法,这里我们是通过动态的方式调用,示例如下

//反射调用泛型
var type_q = ass.GetType("TextCord.GenClass`1");
var typeMake = type_q.MakeGenericType(new Type[] typeof(string) );
var genclass = Activator.CreateInstance(typeMake);
var note = typeMake.GetMethod("Note",new Type[] typeof(string));
note.Invoke(genclass, new object[] "3333");
//强转
GenClass<string> y = (GenClass<string>)Activator.CreateInstance(typeMake);
y.Note("yyyyy");
//动态类型
dynamic d = Activator.CreateInstance(typeMake);

 

以上是关于反射调用泛型的主要内容,如果未能解决你的问题,请参考以下文章

在.NET中使用反射调用泛型方法[重复]

如何使用反射来调用泛型方法?

使用反射来调用泛型方法

泛型与反射

java筑基.泛型,反射,注解-利用注解加反射练习

java的泛型与反射机制