次のようなコードで動的オブジェクトのクローンを作成する際に問題があります。
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;
エンティティの構造を事前に知りません (情報が含まれるということだけで、情報の構造はわかりません)、シリアライズ可能とマークされません。この情報をエンティティの以前の情報セクションにコピーする必要があります。
このコードの実行結果は、fieldFormatter.Serialize 行の「オブジェクト参照がオブジェクトのインスタンスに設定されていません」です。
オブジェクトのインスタンスかどうかを確認するにはどうすればよいですか?
循環参照が存在する可能性があります (おそらく存在する可能性があります)。そのため、対処方法がわからないため、リフレクションを試みていません。また、速度も問題ありません。