zoukankan      html  css  js  c++  java
  • 反射

    一、利用反射通过程序集名称和完整类型名称动态创建对象。

    /// <summary>
    /// 利用反射创建对象。
    /// </summary>
    /// <param name="assemblyFullName">程序集完整名称</param>
    /// <param name="classFullName">类完整名称</param>
    /// <param name="args">对象构造初始参数</param>
    /// <returns></returns>
    public static object CreateObject(string assemblyFullName, string classFullName, object[] args)
    {
    Assembly _assembly = Assembly.Load(assemblyFullName);
    Type _type = _assembly.GetType(classFullName, false);
    if (null != _type)
    return Activator.CreateInstance(_type, args);

    return null;
    }

                #region 使用无参构造函数创建对象
    
                //使用无参构造函数创建对象1
                Assembly asm = Assembly.GetExecutingAssembly();
                object obj = asm.CreateInstance("WebApplication.TestClass");
    
                //使用无参构造函数创建对象2
                ObjectHandle handler = Activator.CreateInstance(null, "WebApplication.TestClass");
                //CreateInstance 第一个参数为程序集名称,为null 表示当前程序集,第二个参数表示要创建的类型  
                Object obj1 = handler.Unwrap();
                //打印:这是一个无参构造函数  
    
                #endregion
    
                #region 使用有参数构造函数创建对象
    
                object[] args =new object[2];
                args[0] = 10;
                args[1] = 20;
                Assembly asm2 = Assembly.GetExecutingAssembly();
                object obj2 = asm2.CreateInstance("WebApplication.TestClass", true, BindingFlags.Default, null, args, null,null);
    
                #endregion



                #region 动态调用方法:使用InvokeMember调用方法
    
                Response.Write("========================== 使用InvokeMember调用方法=====================<br>");
    
                //动态调用无参数方法  
                 Type t = typeof(TestClass);  
                 TestClass ts=new TestClass (1,2);
                 Response.Write("<br>");
                 int result = (int)t.InvokeMember("show", BindingFlags.InvokeMethod,null,ts,null);  
                 Response.Write(result);
                 Response.Write("<br>");
    
                 //动态调用有参静态方法  
                 Type t1 = typeof(TestClass);
                 int result1 = (int)t1.InvokeMember("show", BindingFlags.InvokeMethod, null, t1, args);
                 Response.Write(result1);
                 Response.Write("<br>");
    
                #endregion
    
                #region 使用MethodInfo.Invoke调用方法
    
                 Response.Write("========================== 使用MethodInfo.Invoke调用方法=====================<br>");
    
                   Type t2 = typeof(TestClass);  
                   TestClass ts2 = new TestClass();  
                   MethodInfo mi = t2.GetMethod("show",BindingFlags.Instance|BindingFlags.Public);  
                   int result2=(int)mi.Invoke(ts2, null);
                   Response.Write(result2);
                   Response.Write("<br>");
      
                   Type t3 = typeof(TestClass);  
                   MethodInfo mi1 = t3.GetMethod("show",BindingFlags.Static|BindingFlags.Public);  
                   int result3 = (int)mi1.Invoke(null, args);  
                   Console.WriteLine(result3); 
    
                #endregion
  • 相关阅读:
    浅谈FastJson的TypeReference用法
    勾选表中的行数据,点击添加,添加到另一个表中(二)
    获取表单内的所有元素的值 表单格式化插件jquery.serializeJSON
    基于BootStrap的Collapse折叠(包含回显展开折叠的对应状态)
    删除按钮和单条删除合并
    前台校验是否为空
    浅谈js的join()方法
    select前台转义后台取到的值为对应的文本 select同时接受list和map
    SpringBoot图片上传(二)
    给div拼接html 拼接字符串
  • 原文地址:https://www.cnblogs.com/lxf1117/p/4779283.html
Copyright © 2011-2022 走看看