zoukankan      html  css  js  c++  java
  • 关于反射的那些骚操作

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


    先看一个简单的例子。
     

    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); //获取泛型类型,并指定泛型参数
  • 相关阅读:
    二次型(求梯度) —— 公式的简化
    Opencv中K均值算法(K-Means)及其在图像分割中的应用
    统计学相关概念及机器学习中样本相似性度量之马氏距离
    Opencv中SVM样本训练、归类流程及实现
    1+2+3+...+100 不允许使用乘法和除法,条件分支循环等
    1+2+3+...+100 不允许使用乘法和除法,条件分支循环等
    crtmpserver实现防盗流和流推送验证
    快速幂或者矩阵快速幂
    如何调整 php 应用的上传附件大小?
    三个和数组有关的程序题目(C++)
  • 原文地址:https://www.cnblogs.com/cdoneiX/p/12360082.html
Copyright © 2011-2022 走看看