如何克隆ExpandoObject

Har*_*ald 4 c# wpf dynamic mvvm

这适用于基于MVVM的WPF项目:

ExpandoObject在一个视图模型中使用了一个对话框,它实现得非常好,因为它实现了INotifyPropertyChanged,我可以直接在XAML中绑定到对象的属性.

但是,为了解释用户操纵数据然后点击取消,我需要复制一份ExpandoObject以恢复原始内容.

在对话框中,没有属性添加到对象.

我该如何克隆它?

Mit*_*tch 9

作为静态打字的忠实者,eugh ......

话虽如此,它看起来像ExpandoObject工具IDictionary<string, object>:

dynamic foo1d = new ExpandoObject();
foo1d.a = "test";

dynamic foo2d = new ExpandoObject();
foreach (var kvp in (IDictionary<string, object>)foo1d)
{
    ((IDictionary<string, object>)foo2d).Add(kvp);
}

Debug.Assert(foo1d.a == foo2d.a);
Run Code Online (Sandbox Code Playgroud)

或者在VB中:

Dim foo1d As Object = New ExpandoObject
Dim foo2d As Object = New ExpandoObject
foo1d.a = "foo"

Dim cloneDictionary = CType(foo2d, IDictionary(Of String, Object))
For Each line In CType(foo1d, IDictionary(Of String, Object))
    cloneDictionary.Add(line.Key, line.Value)
Next
Run Code Online (Sandbox Code Playgroud)

我会注意到这只是一个浅层克隆.你必须做进一步的工作克隆引用的对象.


tal*_*les 5

浅拷贝:

static ExpandoObject ShallowCopy(ExpandoObject original)
{
    var clone = new ExpandoObject();

    var _original = (IDictionary<string, object>)original;
    var _clone = (IDictionary<string, object>)clone;

    foreach (var kvp in _original)
        _clone.Add(kvp);

    return clone;
}
Run Code Online (Sandbox Code Playgroud)

深拷贝:

static ExpandoObject DeepCopy(ExpandoObject original)
{
    var clone = new ExpandoObject();

    var _original = (IDictionary<string, object>)original;
    var _clone = (IDictionary<string, object>)clone;

    foreach (var kvp in _original)
        _clone.Add(kvp.Key, kvp.Value is ExpandoObject ? DeepCopy((ExpandoObject)kvp.Value) : kvp.Value);

    return clone;
}
Run Code Online (Sandbox Code Playgroud)