我有一个属性,它在模型中作为对原始组件的引用,来自我的应用程序中的组件列表。我允许用户在对象的“工作”克隆中更改此属性。如果他们在更改结束时单击“确认”,我想直接替换引用的原始对象,以便将其替换为原始对象所在的列表。
这是否可行,因为目前我只是简单地替换对象中的相关属性。
示例:
Model.OriginalObject = [OriginalComponent];
Model.WorkingObject = [CloneOf][OriginalComponent];
//Interaction performed
Model.WorkingObject.Width = Example.Width;
//Original may not be available if a new component so replace properties only if it is available
if (Model.OriginalObject != null)
{
Model.OriginalObject = Model.WorkingObject; //This just replaces the reference
}
else
{
AddComponent(Model.WorkingObject);
}
编辑:忘了说WorkingComponent是OriginalComponent的克隆
答案 0 :(得分:1)
这完全取决于你的对象定义是什么。
对于公共对象(仅包含值类型和所有属性),您只需复制所有公共属性值即可。我用这个:
private static bool IsValueTypeOrString(Type type)
{
return type.IsSubclassOf(typeof (ValueType)) || type == typeof(string);
}
public static void ShallowCopyEntity<T>(T source, T dest, params string[] except)
{
var props = typeof(T).GetProperties(BindingFlags.FlattenHierarchy|BindingFlags.Instance|BindingFlags.Public);
foreach (var prop in props.Where(x => !except.Contains(x.Name) && IsValueTypeOrString(x.PropertyType)))
{
var getMethod = prop.GetGetMethod(false);
if(getMethod == null) continue;
var setMethod = prop.GetSetMethod(false);
if (setMethod == null) continue;
prop.SetValue(dest, prop.GetValue(source));
}
}
PS:我使用它来复制实体框架中实体的标量,因此是“实体”名称,但它可以用于任何使用标量和属性的对象[不是字段]
如果您的对象定义更复杂(包含复杂对象和其他引用),常见的方法是实现ICloneable
(或者具有特定接口,或者如果您的类始终相同则只是命名方法)执行复制,具有“克隆”所需的所有要求(如果需要,可以进行深层复制等)。它不需要是通用的,它可以特定于您的特定对象类型。