zoukankan      html  css  js  c++  java
  • 反射调用泛型

    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);

  • 相关阅读:
    jsonp 跨域解决 spring
    goEasy消息推送,pushlet 向特写用户实时推送
    支持中文加密解密
    webservice 小小例子
    DES加密
    线程、异步
    mysql数据库导出模型到powerdesigner,PDM图形窗口中显示数据列的中文注释
    Log4j按级别输出到不同文件
    niginx 负载均衡
    node-webkit安装及简单实现
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11498526.html
Copyright © 2011-2022 走看看