C# 通过 val 复制通用对象
C# copy generic object by val
我正在制作一个通用控件子类来处理更改跟踪(和其他事情),主要用于数据绑定到底层对象(最终是数据库,但我不应该指望这个)。
我需要跟踪编辑开始时的值、任何给定点的当前值,并在任何给定点保持它们之间的清晰分离。因为不知道类型,适用的属性声明为对象:
class DataboundControl : Control
{
private string _valuePropertyName;
private string _changedEventName;
public Control BaseControl { get; private set; }
public object Value { get { return Objects.GetPropertyValue(this.BaseControl, _valuePropertyName); } }
public bool IsDirty { get { return object.Equals(this.Value, this.ControlEditStartValue); } }
// change tracking
public object ControlEditStartValue { get; set; }
public object RecordEditStartValue { get; set; }
public DataboundControl(Control control, string valuePropertyName, string changedEventName) {
this.BaseControl = control;
this._valuePropertyName = valuePropertyName;
this._changedEventName = changedEventName;
registerChangedEvent();
}
}
在上面的示例中,我需要存储 "non-reffed" 个 ControlEditStartValue 和 RecordEditStartValue 的副本。
考虑到控件值几乎总是标准值类型(字符串、整数、布尔 - 映射到数据库字段的东西),我更愿意默认那样对待它并处理明确的例外情况。
我觉得这应该很容易,但随之而来的是一堆乱七八糟的 shallow/deep 复制内容。鉴于就对象而言,这些值几乎总是非常 "shallow",那么最好的方法是什么?
使用 Json.Net Serialize/Deserialize 值
我正在制作一个通用控件子类来处理更改跟踪(和其他事情),主要用于数据绑定到底层对象(最终是数据库,但我不应该指望这个)。
我需要跟踪编辑开始时的值、任何给定点的当前值,并在任何给定点保持它们之间的清晰分离。因为不知道类型,适用的属性声明为对象:
class DataboundControl : Control
{
private string _valuePropertyName;
private string _changedEventName;
public Control BaseControl { get; private set; }
public object Value { get { return Objects.GetPropertyValue(this.BaseControl, _valuePropertyName); } }
public bool IsDirty { get { return object.Equals(this.Value, this.ControlEditStartValue); } }
// change tracking
public object ControlEditStartValue { get; set; }
public object RecordEditStartValue { get; set; }
public DataboundControl(Control control, string valuePropertyName, string changedEventName) {
this.BaseControl = control;
this._valuePropertyName = valuePropertyName;
this._changedEventName = changedEventName;
registerChangedEvent();
}
}
在上面的示例中,我需要存储 "non-reffed" 个 ControlEditStartValue 和 RecordEditStartValue 的副本。
考虑到控件值几乎总是标准值类型(字符串、整数、布尔 - 映射到数据库字段的东西),我更愿意默认那样对待它并处理明确的例外情况。
我觉得这应该很容易,但随之而来的是一堆乱七八糟的 shallow/deep 复制内容。鉴于就对象而言,这些值几乎总是非常 "shallow",那么最好的方法是什么?
使用 Json.Net Serialize/Deserialize 值