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");//取得委托TypeDeleStatus method = (DeleStatus)Delegate.CreateDelegate(t, machine, "Status");//创建委托
string ret = method("设备");MessageBox.Show(ret);}
