反射机制

.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[] { "新字段" });
复制代码

 

posted @ 2015-05-25 22:48  我亦plj  阅读(216)  评论(0编辑  收藏  举报