apache的jakarta小组有个很著名的组件Commons, 这是一系列由许多细小的类库组成的工具,其中有个BeanUtils,它实现了动态创建bean,以及从bean中获取属性等操作。
事实上c#里的反射也是很强大的,只不过一直没有什么人象jakarta小组那么热心来免费提供可重用的BeanUtils,实在是一个遗憾。
最近再做一个项目,要用到这样的功能,即从一个对象里拷贝所有的字段属性,到另一个对象中,于是写了个BeanUtils类,来实现这样类似的操作。
using System;using System.Reflection;using System.Diagnostics;
namespace com.bairong.commons...{ /** <summary> /// BeanUtils提供用于拷贝对象中的具体字段的值的方法 /// </summary> public class BeanUtils ...{ /** <summary> /// 把源对象里的各个字段的内容直接赋值给目标对象(只是字段复制,两个对象的字段名和类型都必须一致) /// </summary> /// <param name="dest">目标对象</param> /// <param name="src">源对象</param> public static void CopyObject(ref object dest, object src) ...{ if (null == src) ...{ throw new ArgumentNullException("src can't be null"); } if (null == dest) ...{ throw new ArgumentNullException("dest can't be null"); } Type srcType = src.GetType(); Type destType = dest.GetType();
FieldInfo[] srcInfo = srcType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); FieldInfo[] destInfo = destType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
for (int i = 0; i < srcInfo.Length; i++) ...{ string name = srcInfo[i].Name; object val = srcInfo[i].GetValue(src);
for (int j = 0; j < destInfo.Length; j++) ...{ string targetName = destInfo[j].Name;
if (name.Equals(targetName)) ...{ destInfo[j].SetValue(dest, val); break; } } } }
/** <summary> /// 从一个对象里复制属性到另一个对象的同名属性 /// </summary> /// <param name="dest">目标对象</param> /// <param name="src">源对象</param> /// <param name="fieldName">要复制的属性名字</param> public static void CopyProperty(ref object dest, object src, string fieldName) ...{ if (null == src || null == dest || null == fieldName) ...{ throw new ArgumentNullException("one argument is null!"); } Type srcType = src.GetType(); Type destType = dest.GetType(); FieldInfo srcInfo = srcType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); FieldInfo destInfo = destType.GetField(fieldName,BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); object val = srcInfo.GetValue(src); destInfo.SetValue(dest, val);
}
/** <summary> /// 用于设置对象的属性值 /// </summary> /// <param name="dest">目标对象</param> /// <param name="fieldName">属性名字</param> /// <param name="value">属性里要设置的值</param> public static void setProperty(ref object dest, string fieldName, object value) ...{ if (null == dest || null == fieldName || null == value) ...{ throw new ArgumentNullException("one argument is null!"); } Type t = dest.GetType(); FieldInfo f = t.GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); f.SetValue(dest, value); }
/** <summary> /// 反射打印出对象有的方法以及调用参数 /// </summary> /// <param name="obj">传入的对象</param> public static void printMethod(ref object obj) ...{ Type t = obj.GetType(); MethodInfo[] mif = t.GetMethods(BindingFlags.Public | BindingFlags.Instance); for (int i = 0; i < mif.Length; i++) ...{ Trace.WriteLine("方法名字: {0} ", mif[i].Name); Trace.WriteLine("方法来自: {0}", mif[i].Module.Name); ParameterInfo[] p = mif[i].GetParameters(); for (int j = 0; j < p.Length; j++) ...{ Trace.WriteLine("参数名: " + p[j].Name); Trace.WriteLine("参数类型: " + p[j].ParameterType.ToString()); } Trace.WriteLine("******************************************"); } }
}}
