这是一个基于MVVM的WPF项目:
我在一个对话框的视图模型中使用了一个ExpandoObject,因为它实现了INotifyPropertyChanged,并且我可以在XAML中直接绑定到对象的属性,所以它工作得很好。
但是,要考虑用户处理数据,然后点击cancel,我需要创建一个ExpandoObject副本来恢复原始内容。
在对话框中,不向对象添加属性。
我怎么能克隆它?
发布于 2014-04-03 04:44:49
作为静态打字的忠实信徒,呃.
尽管如此,看起来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);或者在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我要指出的是,这只是一个肤浅的克隆。您必须做进一步的工作,做克隆引用的对象。
发布于 2016-11-07 16:47:01
浅版:
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;
}深拷贝:
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;
}发布于 2015-11-25 17:18:25
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是动态对象的属性,它就能工作。
如果您正在使用一个没有具体类型的服务调用,并且您希望修改/排序结果,那么它是非常有用的。
https://stackoverflow.com/questions/22826610
复制相似问题