///
<summary>
/// 设置实体对象的修改属性
/// 说明:需要复制一个实体类,而又不希望两个使用同一个内存地址,用反射来实现这种功能:把oldObj 赋值给 newObj
/// 可以将实体类直接继承ICloneable接口,并用如上方法来实现Clone()方法.
/// 现在有不少架构直接使用自动代码生成器,也可以不使用反射直接每个属性值进行拷贝亦可
/// </summary>
/// <param name="oldObj"> 原来对象 </param>
/// <param name="newObj"> 新对象 </param>
public static void CloneEntityObject( object oldObj, object newObj)
{
if (oldObj.Equals(newObj))
{
return;
}
if (oldObj.GetType() != newObj.GetType())
{
return;
}
System.Reflection.PropertyInfo[] info = oldObj.GetType().GetProperties();
foreach (System.Reflection.PropertyInfo property in info)
{
newObj.GetType().GetProperty(property.Name).SetValue(newObj, oldObj.GetType().GetProperty(property.Name).GetValue(oldObj, null), null);
}
}
/// 设置实体对象的修改属性
/// 说明:需要复制一个实体类,而又不希望两个使用同一个内存地址,用反射来实现这种功能:把oldObj 赋值给 newObj
/// 可以将实体类直接继承ICloneable接口,并用如上方法来实现Clone()方法.
/// 现在有不少架构直接使用自动代码生成器,也可以不使用反射直接每个属性值进行拷贝亦可
/// </summary>
/// <param name="oldObj"> 原来对象 </param>
/// <param name="newObj"> 新对象 </param>
public static void CloneEntityObject( object oldObj, object newObj)
{
if (oldObj.Equals(newObj))
{
return;
}
if (oldObj.GetType() != newObj.GetType())
{
return;
}
System.Reflection.PropertyInfo[] info = oldObj.GetType().GetProperties();
foreach (System.Reflection.PropertyInfo property in info)
{
newObj.GetType().GetProperty(property.Name).SetValue(newObj, oldObj.GetType().GetProperty(property.Name).GetValue(oldObj, null), null);
}
}
在silverlight 中咱们会遇到这种情况:
var A=
"
a
";
var B=A;
// 然后我修改B的值。
B= " b ";
// 你会发现 A="b";
// 然后我修改B的值。
B= " b ";
// 你会发现 A="b";
这是因为通过赋值的时候A、B用了同一个内存地址。 你是否发现这是很严重的问题...所以咱们可以通过上边的方法来避免。
var A=
"
a
";
var B=
"";
CloneEntityObject(A,B); // 把A赋值给B
// 然后我修改B的值。
B= " b ";
// 你会发现 A任然等于"a";
CloneEntityObject(A,B); // 把A赋值给B
// 然后我修改B的值。
B= " b ";
// 你会发现 A任然等于"a";
一点工作中遇到的经验,希望对大家有帮助。