// 重新设置字段值 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)); } }
// 另一种方法设置属性值 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); } }
// 获取字段值 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)); } }
// 操作 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); } }
// 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()); } } }