首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何克隆ExpandoObject

如何克隆ExpandoObject
EN

Stack Overflow用户
提问于 2014-04-03 02:15:22
回答 3查看 5.1K关注 0票数 6

这是一个基于MVVM的WPF项目:

我在一个对话框的视图模型中使用了一个ExpandoObject,因为它实现了INotifyPropertyChanged,并且我可以在XAML中直接绑定到对象的属性,所以它工作得很好。

但是,要考虑用户处理数据,然后点击cancel,我需要创建一个ExpandoObject副本来恢复原始内容。

在对话框中,不向对象添加属性。

我怎么能克隆它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-03 04:44:49

作为静态打字的忠实信徒,呃.

尽管如此,看起来ExpandoObject实现了IDictionary<string, object>

代码语言:javascript
复制
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);

或者在VB中:

代码语言:javascript
复制
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

我要指出的是,这只是一个肤浅的克隆。您必须做进一步的工作,做克隆引用的对象。

票数 11
EN

Stack Overflow用户

发布于 2016-11-07 16:47:01

浅版:

代码语言:javascript
复制
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;
}

深拷贝:

代码语言:javascript
复制
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;
}
票数 13
EN

Stack Overflow用户

发布于 2015-11-25 17:18:25

代码语言:javascript
复制
var ExpandoObjs = GetDynamicList();
//clone
var clonedExpandos = ExpandoObjs.Cast<dynamic>().Select(x => x).ToList();
//modify and sort
var transformedExpandos = ExpandoObjs.Cast<dynamic>().Select(x =>
{
    x.url= x.url + " some more stuff";
    return x;
}).OrderBy(x => x.order).ToList();

只要url是动态对象的属性,它就能工作。

如果您正在使用一个没有具体类型的服务调用,并且您希望修改/排序结果,那么它是非常有用的。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22826610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档