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 值