反射机制
.Net Framework 中提供了反射机制,可以再加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息
在程序集中,包含模块(Module),模块包含类型,类型包含成员,提供反射,我们可以查看到一个程序集的路径,命名空间,类。我们还可以对其进行操作
可以对程序集的类进行实例化,掉用类中的方法等,就跟我们普通使用程序集一样
namespace 环环环环环 { public class User { //字段 public string Field; //属性 public string Name { get; set; } //构造函数 public User() { this.Name = "无参构造"; } public User(string name) { this.Name = name; } //public函数 public void PublicShow() { Console.WriteLine(string.Format("反射调用一个public方法")); } //private函数 private void PrivateShow() { Console.WriteLine(string.Format("反射调用一个Private方法")); } //static函数 public static string StaticMethod() { return "反射调用了一个Static方法"; } //带参带返回值函数 public string GetString(string name) { return string.Format("大家好,我的名字是:{0}!", name); } //事件 public event EventHandler eventHandler; //事件处理函数 public void DoEvent() { if(eventHandler != null) eventHandler(null, EventArgs.Empty); } } }
//获取程序集 Assembly assembly = Assembly.Load("环环环环环"); Assembly assembly2 = Assembly.LoadFrom("环环环环环.dll"); //从程序集中获取指定对象类型; Type type = assembly.GetType("环环环环环.User"); //使用Activator创建实例(无参数构造函数) var user1 = Activator.CreateInstance(type); //使用Activator创建实例(带参数构造函数) var user2 = Activator.CreateInstance(type, "薄暮"); //使用Assembly创建实例(无参数构造函数) var user3 = assembly.CreateInstance("环环环环环.User"); //反射无参构造函数 ConstructorInfo constructor1 = type.GetConstructor(new Type[] {}); var user4 = constructor1.Invoke(new object[] { }); //反射有参构造函数 ConstructorInfo constructor2 = type.GetConstructor(new Type[] { typeof(string) }); var user5 = constructor2.Invoke(new object[] { "薄暮" }); //调用public函数(无参数) type.InvokeMember("PublicShow", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, user1, null); //调用public函数(带参数) string returnValue = type.InvokeMember("GetString", BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, user1, new object[] { "薄暮" }) as string; // 调用静态方法 string returnValue2 = type.InvokeMember("StaticMethod", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, new object[] {}) as string; // 调用私有方法 . type.InvokeMember("PrivateShow", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, user1, new object[] {}); //反射属性 var Name = type.InvokeMember("Name", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance, null, user1, new object[] {}) as string; //设置属性(设置Name属性为"新属性") type.InvokeMember("Name", BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance, null, user1, new object[] {"新属性"}); //反射字段 string Field = type.InvokeMember("Field", BindingFlags.GetField | BindingFlags.Public | BindingFlags.Instance, null, user1, new object[] {}) as string; //设置字段(设置Field字段为"新字段") type.InvokeMember("Field", BindingFlags.SetField | BindingFlags.Public | BindingFlags.Instance, null, user1, new object[] { "新字段" }); 复制代码