Esempio n. 1
0
        // 重新设置字段值
        public static void setValue()
        {
            Type     t  = typeof(RefClass);
            RefClass rc = new RefClass();

            rc.id = 3;

            FieldInfo[] finfos = t.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
            foreach (FieldInfo finfo in finfos)
            {
                // 判断字段类型赋值
                if (finfo.FieldType.Name.Equals("Int32"))
                {
                    finfo.SetValue(rc, 100);
                }
                else if (finfo.FieldType.Name.Equals("String"))
                {
                    finfo.SetValue(rc, "hello world!");
                }
                // else if ...

                Console.WriteLine("字段名称:{0}  字段类型:{1} rc中的值为:{2}",
                                  finfo.Name,
                                  finfo.FieldType.Name,//.ToString(),
                                  finfo.GetValue(rc));
            }
        }
Esempio n. 2
0
        // 另一种方法设置属性值
        public static void setPropertyValue()
        {
            Type     t  = typeof(RefClass);
            RefClass rc = new RefClass();

            rc.id = 3;

            PropertyInfo[] finfos = t.GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
            foreach (PropertyInfo finfo in finfos)
            {
                if (finfo.CanWrite)
                {
                    finfo.SetValue(rc, Convert.ChangeType(12389, finfo.PropertyType, CultureInfo.CurrentCulture), null);
                }

                Object obj = finfo.GetValue(rc);
                Console.WriteLine("{0} - {1} \n", obj, finfo.Name);
            }
        }
Esempio n. 3
0
        // 获取字段值
        public static void getFieldValue()
        {
            Type t = typeof(RefClass);

            RefClass rc = new RefClass();

            rc.id = 3;

            FieldInfo[] finfos = t.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
            foreach (FieldInfo finfo in finfos)
            {
                // 一次获取各个字段的值, 包括非公有字段
                Console.WriteLine("字段名称:{0}  字段类型:{1} rc中的值为:{2}",
                                  finfo.Name,
                                  finfo.FieldType.ToString(),
                                  // finfo.FieldType.Name.ToString(),
                                  finfo.GetValue(rc));
            }
        }
Esempio n. 4
0
        // 操作 get set 属性, 获取get,set方法的各种参数,类型,返回类型等信息
        public static void setProperty()
        {
            Type     t  = typeof(RefClass);
            RefClass rc = new RefClass();

            rc.id = 3;

            PropertyInfo[] finfos = t.GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
            foreach (PropertyInfo finfo in finfos)
            {
                // 获取 get 方法
                MethodInfo getinfo = finfo.GetGetMethod(true);
                Console.WriteLine("get方法的名称{0}  返回值类型:{1}  参数数量:{2}  MSIL代码长度:{3} 局部变量数量:{4}",
                                  getinfo.Name,                                      // 属性的方法名
                                  getinfo.ReturnType.ToString(),                     // 属性类型,也是方法返回类型
                                  getinfo.GetParameters().Count(),                   // 参数个数, get=0; set=1
                                  getinfo.GetMethodBody().GetILAsByteArray().Length, //
                                  getinfo.GetMethodBody().LocalVariables.Count);     // 局部变量个数

                // 获取 set 方法
                MethodInfo setinfo = finfo.GetSetMethod(true);
                Console.WriteLine("get方法的名称{0}  返回值类型:{1}  参数数量:{2}  MSIL代码长度:{3} 局部变量数量:{4}",
                                  setinfo.Name,
                                  setinfo.ReturnType.ToString(),
                                  setinfo.GetParameters().Count(),
                                  setinfo.GetMethodBody().GetILAsByteArray().Length,
                                  setinfo.GetMethodBody().LocalVariables.Count);

                /*if ( finfo.PropertyType.Name.Equals("Int32") || finfo.PropertyType.Name.Equals("Double"))
                 *  setinfo.Invoke(rc, new object[] { 123 });
                 * else if (finfo.PropertyType.Name.Equals("String"))
                 *  setinfo.Invoke(rc, new object[] { "hello world!" });*/

                // 设置属性值, 自动根据属性类型转换
                setinfo.Invoke(rc, new Object[] { Convert.ChangeType(123456, finfo.PropertyType, CultureInfo.CurrentCulture) });

                // 获取属性值
                object obj = getinfo.Invoke(rc, null);
                Console.WriteLine("方法名:{0}  内部值:{1} \n", finfo.Name, obj);
            }
        }
Esempio n. 5
0
        //
        public static void setMethod()
        {
            Type     t  = typeof(RefClass);
            RefClass rc = new RefClass();

            rc.id = 3;

            // 包括 get 和 set 和 正常的方法
            MethodInfo[] finfos = t.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Static);
            foreach (MethodInfo finfo in finfos)
            {
                // Console.WriteLine("{0} \n", finfo.ReturnType.Name);
                //if (finfo.GetParameters().Count() > 0 && finfo.GetParameters()[0].ParameterType == typeof(string))

                // 不能是 get 或 set 方法!!!
                if (finfo.GetParameters().Count() > 0 && finfo.ReturnType.Name.Equals("String"))
                {
                    // 传递参数到非 set 方法, 不能传递给 set 方法
                    object obj = finfo.Invoke(rc, new[] { "123" });
                    //  object obj = finfo.Invoke(rc, new Object[] { Convert.ChangeType(123456, finfo.GetParameters()[0].ParameterType, CultureInfo.CurrentCulture) });

                    MethodBody mbody = finfo.GetMethodBody();
                    Console.WriteLine("拥有参数的方法名:{0}  返回值类型:{1}  参数1类型:{2}  参数1名称:{3}  方法调用后返回的值:{4}",
                                      finfo.Name,
                                      finfo.ReturnType.ToString(),
                                      finfo.GetParameters()[0].ParameterType.ToString(),
                                      finfo.GetParameters()[0].Name,
                                      obj.ToString());
                }
                else
                {
                    MethodBody mbody = finfo.GetMethodBody();
                    Console.WriteLine("没有参数的方法名:{0}  返回值类型:{1}",
                                      finfo.Name,
                                      finfo.ReturnType.ToString());
                }
            }
        }