• 关于反射的那些骚操作


    第一部份:知道 泛型类型,但泛型参数需要动态的情况


    先看一个简单的例子。
     

    class Class1<T>
    {
      public void Test(T t)
      {
        Console.WriteLine(t);
      }
    }

     
    要利用反射动态创建该类型实例,并调用 Test 方法,我们可以使用如下方法

     
    Type type = typeof(Class1<int>);
    object o = Activator.CreateInstance(type);
    type.InvokeMember("Test", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, new object[] { 123 });


    若泛型参数是未定的,可采用如下方法:
     

    static void InvokeTest(Type t, params object[] args)
    {
      Type type = typeof(Class1<>);
      type = type.MakeGenericType(t);
      object o = Activator.CreateInstance(type);
      type.InvokeMember("Test", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, args);
    }


    另外一种情况就是泛型方法,

    class Class1
    {
      public void Test<T>(T t)
      {
        Console.WriteLine(t);
      }
    }


    方法类似,只不过这回使用的是 MethodInfo.MakeGenericMethod()
     

    static void InvokeTest(Type t, params object[] args)
    {
      Type type = typeof(Class1);
      object o = Activator.CreateInstance(type);
      MethodInfo method = type.GetMethod("Test", BindingFlags.Instance | BindingFlags.Public);
     
      method = method.MakeGenericMethod(t);
      method.Invoke(o, args);
    }

     

    当然还有实例化一个泛型

    例如有GenericType<M,N>

    Type genericType = typeof(GenericType<>);
    
    Type[] templateTypeSet = new[] { typeof(string), typeof(int) };
    
    Type implementType = genericType.MakeGenericType( templateTypeSet )

    这样 implementType类型就是赋予了string,int的泛型类了

    第二种部份:泛型类型及参数均需要动态指定的情况

     Type entityType = typeof(T);
    
    Assembly assy = Assembly.GetExecutingAssembly();
    
    //注意:以下字符串中的`1表示泛型参数占位符个数,一个泛型参数则表示为:`1,多个泛型参数则表示为:`N;
    
    string genericTypeAssyName = string.Format("{0}.{1}Repository`1", assy.GetName().Name,entityType.Name);
    var repositoryType = assy.GetType(repositoryAssyName, true, true);//获取泛型类型,不含泛型参数
    var repositoryType = repositoryType.MakeGenericType(entityType); //获取泛型类型,并指定泛型参数
  • 相关阅读:
    C#--SQL server数据库基本操作(增、删、改、查)
    《linux就该这么学》课堂笔记05 管道符、通配符、转义、vim编辑器
    《linux就该这么学》课堂笔记04 常用命令cat、mor...tar、find
    《linux就该这么学》课堂笔记03 命令初识 echo、date、reboot、poweroff、wget...
    《linux就该这么学》课堂笔记02 虚拟机安装使用
    《Linux就该这么学》课堂笔记01 linux初识
    paramiko
    restframework详细
    部署你的CRM程序
    nginx+uWSGI+django+virtualenv+supervisor发布web服务器
  • 原文地址:https://www.cnblogs.com/cdoneiX/p/12360082.html
Copyright © 2020-2023  润新知