• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#类的反射实例

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
创建在一个命名空间下的类Class1和不在同一个命名空间下的Class1
(在这里这些类只使用于被调用的,意义不大。反射用法在Form类里面)

Class1和Form 窗体在同一个命名空间
using System;
using System.Collections.Generic;
using System.Text;

namespace fanshetest1
{
    class Class1
    {
        private string ab="1";
        public Class1(string aa)
        {
            a = aa;
        }
        public int  aa(int x,int y)
        {
            return x+y+x+y;
        }
        public string bb()
        {
            return "bb";
        }
        public static string cc()
        {
            return "cc";
        }
        public string AB
        {
            get
            {
                return ab;
            }
            set
            {
                ab = value;
            }
        }
        public string a;
    }
}

Class1和Form 窗体在不同一个命名空间
using System;
using System.Collections.Generic;
using System.Text;

namespace fanshetest1
{
    class Class1
    {
        private string ab="1";
        public Class1(string aa)
        {
            a = aa;
        }
        public int  aa(int x,int y)
        {
            return x+y+x+y;
        }
        public string bb()
        {
            return "bb";
        }
        public static string cc()
        {
            return "cc";
        }
        public string AB
        {
            get
            {
                return ab;
            }
            set
            {
                ab = value;
            }
        }
        public string a;
    }
}
下面是如何使用反射操作以上类;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
namespace fanshetest
{
    public partial class Form1 : Form
    {
        System.Reflection.Assembly a;
        System.Reflection.Assembly b;
        public Form1()
        {
            InitializeComponent();
            a = System.Reflection.Assembly.LoadFrom("Class1.DLL");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            gouzaohanshu();
          

        }
       //没有传参数,返回一个类型;
        private void One()
        {
            //再另建一个项目,在项目中引用上面生成的ClassLibrary1.DLL
            System.Type t = a.GetType("Class1.Class1");
            //动态生成ClassLibrary1.Class类的实例
            Object theObj = System.Activator.CreateInstance(t);
            //参数信息,GetSum需要两个string参数
            System.Type[] paramTypes = new System.Type[2];
            paramTypes[0] = System.Type.GetType("System.String");
            paramTypes[1] = System.Type.GetType("System.String");
            //System.Reflection.MethodInfo mi = t.GetMethod("aa", paramTypes);
            System.Reflection.MethodInfo mi = t.GetMethod("bb");
            //参数值
            Object[] parameters = new Object[2];
            parameters[0] = 3;
            parameters[1] = 4;

            Object returnValue = mi.Invoke(theObj, null);
            this.textBox1.Text = returnValue.ToString();
        }
        //没有返回值,调用的是直接执行函数
        private void None_void()
        {
            //再另建一个项目,在项目中引用上面生成的ClassLibrary1.DLL
            System.Type t = a.GetType("Class1.Class2");
            //动态生成ClassLibrary1.Class类的实例
            Object theObj = System.Activator.CreateInstance(t);
            //参数信息,GetSum需要两个string参数
            System.Type[] paramTypes = new System.Type[2];
            //此处调用方法,如果有参数只需要在括号的后面加上"," 加上参数的type[]类型的参数
            System.Reflection.MethodInfo mi = t.GetMethod("Mes");
            Object returnValue = mi.Invoke(theObj, null);

        }
        //没有返回值,传出参数接收返回值;
        private void Two()
        {
            Type t = a.GetType("Class1.Class1");
            Object theObj = Activator.CreateInstance(t);
            Type[] types=new Type[2];
            types[0]=Type.GetType("System.Int32");
            types[1]=Type.GetType("System.Int32");
            Object[] obj=new Object[2];
            obj[0]=2;
            obj[1]=3;
            MethodInfo mi = t.GetMethod("aa",types);
           Object returnValue=mi.Invoke(theObj,obj);
           this.textBox1.Text = returnValue.ToString();
        }
        //获取同一个命名空间的反射出值
        private void Local()
        {
            Type t=Type.GetType("fanshetest1.Class1");
            //创建一个 实例
            Object theObj = Activator.CreateInstance(t);
            Type[] types=new Type[2];
            types[0]=Type.GetType("System.Int32");
            types[1] = Type.GetType("System.Int32");
            Object[] obj = new Object[2];
            obj[0] = 2;
            obj[1] = 3;
            MethodInfo mi = t.GetMethod("aa",types);
            Object returnValue = mi.Invoke(theObj,obj);
            this.textBox1.Text = returnValue.ToString();
        }
        //获取出一个属性
        private void attribute()
        {
            a = Assembly.LoadFrom("Class1.dll");
            Type t = a.GetType("Class1.Class1");
            t = Type.GetType("fanshetest1.Class1");
            Object theObj = Activator.CreateInstance(t);
            t.GetProperty("AB").SetValue(theObj,"a",null);
            this.textBox1.Text = t.GetProperty("AB").GetValue(theObj, null).ToString();
        }
        //获取出静态的函数;
        private void static_()
        {
            a = System.Reflection.Assembly.LoadFrom("Class1.dll");
            Type t = a.GetType("Class1.Class1");
            t = Type.GetType("fanshetest1.Class1");
            //创建一个实例
            Object theObj = Activator.CreateInstance(t);
            //创建一个方法的实例
            MethodInfo mi = t.GetMethod("cc");
            Object returnValue = mi.Invoke(theObj, null);
            this.textBox1.Text = returnValue.ToString();
        }
        //获取出变量;
        private void variable()
        {
            a = Assembly.LoadFrom("Class1.dll");
            Type t = a.GetType("Class1.Class1");
            t = Type.GetType("fanshetest1.Class1");
            Object theObj = Activator.CreateInstance(t);
            MethodInfo mi = t.GetMethod("a");
            t.GetField("a").SetValue(theObj,"a");
            this.textBox1.Text = t.GetField("a").GetValue(theObj).ToString();
        }
        //获取出私有变量反射值;
        private void private_()
        {
           
        }
        //构造函数
        private void gouzaohanshu()
        {
            Type t = a.GetType("Class1.Class1");
            t = Type.GetType("fanshetest1.Class1");
            //创建构造函数类型
            Type[] structure_Type = new Type[1];
            structure_Type[0] = Type.GetType("System.String");
            //定义构造函数传参类型
            Object[] structure_Obj = new Object[1];
            structure_Obj[0] = "aa";
            //创建一个 实例
            Object theObj = Activator.CreateInstance(t,structure_Obj);
            //MethodInfo structure_Mi = t.GetConstructor(structure_Type);
            //MethodInfo structure_Mi = t.GetMethod("Class1", structure_Type);
            //structure_Mi.Invoke(theObj, structure_Obj);

            MethodInfo mi = t.GetMethod("a");
            //t.GetField("a").SetValue(theObj, "a");
            this.textBox1.Text = t.GetField("a").GetValue(theObj).ToString();
        }

    }
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
c#gdi设置画刷透明发布时间:2022-07-10
下一篇:
AutoCAD图形打印出图片 C#发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap