直接替换属性引用的对象

时间:2016-05-19 09:32:10

标签: c# properties

我有一个属性,它在模型中作为对原始组件的引用,来自我的应用程序中的组件列表。我允许用户在对象的“工作”克隆中更改此属性。如果他们在更改结束时单击“确认”,我想直接替换引用的原始对象,以便将其替换为原始对象所在的列表。

这是否可行,因为目前我只是简单地替换对象中的相关属性。

示例:

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的克隆

1 个答案:

答案 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(或者具有特定接口,或者如果您的类始终相同则只是命名方法)执行复制,具有“克隆”所需的所有要求(如果需要,可以进行深层复制等)。它不需要是通用的,它可以特定于您的特定对象类型。