#region 列表相关
public static void Clone(Type type, object srcData, object destData)
{
//复制基类数据
Type baseType = type;
FieldInfo[] baseAllFields = null;
baseAllFields = baseType.GetFields(BindingFlags.DeclaredOnly | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance | BindingFlags.Static);
if (baseAllFields != null || baseAllFields.Length > 0)
{
foreach (FieldInfo field in baseAllFields)
{
object value = field.GetValue(srcData);
field.SetValue(destData, value);
}
}
if (baseType.BaseType != null)
Clone(baseType.BaseType, srcData, destData);
}
public static object Clone(object srcData)
{
Type typeData = srcData.GetType();
FieldInfo[] allFields = null;
allFields = typeData.GetFields(BindingFlags.DeclaredOnly | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance | BindingFlags.Static);
if (allFields == null || allFields.Length < 1)
return null;
object destData = Activator.CreateInstance(typeData);
foreach (FieldInfo field in allFields)
{
object value = field.GetValue(srcData);
field.SetValue(destData, value);
}
if (typeData.BaseType != null)
Clone(typeData.BaseType, srcData, destData);
return destData;
}
public static bool Equal(object srcData, object destData)
{
return Equal(srcData, destData, null, null);
}
/// <summary>
/// 比较对象是否相等
/// </summary>
/// <param name="srcData">源数据</param>
/// <param name="destData">要比较的数据</param>
/// <param name="rejectiveFields">不比较的成员变量名</param>
/// <param name="rejectiveTypes">不比较的成员变量类型</param>
/// <returns></returns>
public static bool Equal(object srcData, object destData, string[] rejectiveFields, Type[] rejectiveTypes)
{
if (srcData.GetType() != destData.GetType())
return false;
Type typeData = srcData.GetType();
FieldInfo[] allFields = null;
allFields = typeData.GetFields(BindingFlags.DeclaredOnly | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance | BindingFlags.Static);
if (allFields == null || allFields.Length < 1)
return true;
foreach (FieldInfo field in allFields)
{
object srcValue = field.GetValue(srcData);
object destValue = field.GetValue(destData);
bool isContine = false;
if (rejectiveFields != null)
{
foreach (string rejectiveField in rejectiveFields)
{
if (rejectiveField == field.Name)
{
isContine = true;
break;
}
}
if (isContine == true)
continue;
}
if (rejectiveTypes != null)
{
foreach (Type rejectiveType in rejectiveTypes)
{
if (rejectiveType == srcValue.GetType())
{
isContine = true;
break;
}
}
if (isContine == true)
continue;
}
if (object.Equals(srcValue, destValue) == false)
return false;
}
return true;
}
#endregion