管理杂谈OA答疑ERP答疑教程搜索

C# 反射 Reflection 进阶


反射是C#编程中的一个重要特性,它允许程序在运行时获取和操作对象的信息,而无需事先创建对象或者指定对象的具体实现。通过反射,程序可以动态地创建、获取、修改和删除对象,从而实现更加灵活和强大的编程能力。

反射的实现依赖于程序运行时的环境,其中包括.NET框架中的类型信息和字段、方法、属性等信息。在C#中,程序可以通过System.Reflection命名空间中的类和接口来访问和操作这些信息。例如,使用Type类可以获取指定类型的类名、方法名、字段名等信息;使用MethodInfo类可以获取指定方法的方法名、参数类型、返回值类型等信息;使用FieldInfo类可以获取指定字段的字段名、数据类型、访问权限等信息。

正文


通过Type创建一个类的实例

做一个基础类Machine

public class Machine

{

    public string Name { get; set; }

    public string Location { get; set; }


    public decimal Amount = 1;


    public Machine()

    {


    }


    public Machine(string name, string location)

    {

        Name = name;

        Location = location;

    }


    public bool Run()

    {

        MessageBox.Show(this.Name+" "+"Run" + DateTime.Now.ToString());

        return true;

    }


    public void Stop()

    {

        MessageBox.Show(this.Name + " " + "Stop" + DateTime.Now.ToString());

    }

}

实例化这个类

private void btnCreateClass_Click(object sender, EventArgs e)

{

    Type t = Type.GetType("s77.Machine");

    //构造器的参数

    object[] args = new object[] { "设备2", "北京", 9000 };

    //创建对象

    object obj =Activator.CreateInstance(t,new object[] {"设备2","北京"});

    //获取方法的信息

    MethodInfo method = t.GetMethod("Run");

    //调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值

    BindingFlags flag = BindingFlags.Public | BindingFlags.Instance;

    method.Invoke(obj,new object[] { });    

}

动态创建一个委托

调整一个Machine 类

delegate string DeleStatus(string name);

public class Machine

{

    public string Name { get; set; }

    public string Location { get; set; }

    public decimal Amount = 1;


    public Machine()

    {


    }


    public Machine(string name, string location)

    {

        Name = name;

        Location = location;

    }


    public bool Run()

    {

        MessageBox.Show(this.Name+" "+"Run" + DateTime.Now.ToString());

        return true;

    }


    public void Stop()

    {

        MessageBox.Show(this.Name + " " + "Stop" + DateTime.Now.ToString());

    }


    public string Status(string name)

    {

        return name+" OK";

    }

}

调用

private void btnCreateDelegate_Click(object sender, EventArgs e){
    Type t = Type.GetType("s77.DeleStatus");//取得委托Type
    DeleStatus method = (DeleStatus)Delegate.CreateDelegate(t, machine, "Status");//创建委托
    string ret = method("设备");
    MessageBox.Show(ret);
}


更多精彩文章浏览...
点击右上角图标分享到朋友圈
官方网站:http://www.clicksun.cn
咨询热线:400-186-1886
服务邮箱:service@clicksun.cn