我在使用如下代码克隆动态对象时遇到问题:
public void Execute(IPrepareData entity)
{
try
{
dynamic data = entity.Primary as dynamic;
data.PreviousInfo = deepClone(data.Info);
}
catch (Exception ex)
{
data.Errors.Add(ex.Message);
}
}
private static T deepClone<T>(T obj)
{
if (typeof(T).IsClass || typeof(T).IsArray)
{
if (ReferenceEquals(obj, null))
{
return default(T);
}
}
using (var memoryStream = new MemoryStream())
{
BinaryFormatter fieldFormatter = new BinaryFormatter();
fieldFormatter.Serialize(memoryStream, obj);
memoryStream.Position = 0;
return (T)fieldFormatter.Deserialize(memoryStream);
}
}
dynamic data;
Run Code Online (Sandbox Code Playgroud)
我事先不知道实体的结构(只知道它会包含信息,我不知道信息的结构)并且它不会被标记为可序列化。我需要将此信息复制到实体的上一个信息部分。
此代码的执行结果是 fieldFormatter.Serialize 行上的“对象引用未设置为对象的实例”。
如何检查它是否是对象的实例?
可能(很可能会有)循环引用,所以我没有尝试反射,因为我不确定如何处理。速度也不是问题。
如果您不知道数据将被标记为可序列化,那么您不能依赖使用BinaryFormatter.
如果对象可能有循环引用,那么许多其他序列化器就不可能了。
如果我们假设这是(而不仅仅是)的一般情况,那么就无法获取有关成员的信息,因为它们可以在查询时被发明。dynamicExpandoObject
基本上,这种情况*没有好的答案。没有什么神奇的方法可以深度克隆“一个东西”。
关于什么
var clone = JsonConvert.DeserializeObject<dynamic>(JsonConvert.SerializeObject(obj));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6543 次 |
| 最近记录: |