3

次のクラスがあります。

public partial class AuthorizationSetObject
{
   public AuthorizationObjectList AuthorizationObjects { get; set; }
}

public partial class AuthorizationObject
{
   public string Text { get; set; }
}

public partial class AuthorizationObjectList : List<AuthorizationObject>
{
}

AuthorizationSetObject のディープ コピーが必要です。これどうやってするの?

私はこのように試しました:

public static bool CopyProperties(object source, object target)
{
    var customerType = target.GetType();
    foreach (var prop in source.GetType().GetProperties())
    {
        var propGetter = prop.GetGetMethod();
        if (propGetter != null)
        {
            PropertyInfo pi = customerType.GetProperty(prop.Name);
            if (pi != null)
                {
                var propSetter = pi.GetSetMethod();
                if (propSetter != null)
                {
                    var valueToSet = propGetter.Invoke(source, null);
                    propSetter.Invoke(target, new[] { valueToSet });
                }
            }
        }
    }
    return true;
}

問題は、AuthorizationObjectList が実際のディープ コピーではないことです。ディープ コピー後にターゲットからプロパティ "Text" を変更すると、ソースからの "Text" も変更されます。

おそらく、「pi.PropertyType.BaseType.IsGenericType」のような実装が必要で、それから何か他のことをする必要があります...しかし、何??

誰かアイデアがありますか?

4

1 に答える 1

0

あなたの質問に投稿されたコメントはすべて正しい方向を指しています。問題は、その行にあることです

propSetter.Invoke(target, new[] { valueToSet });

valueToSet は参照です。これは、同じオブジェクトへの参照をリストに追加することを意味します。これで、ICloneableが配置されます。valueToSet のタイプが ICloneable を実装している場合は、使用できます

propSetter.Invoke(target, new[] { valueToSet.Clone() });

代わりに、このインスタンスの新しいディープ コピーが生成されます。

于 2012-11-11T10:28:05.170 に答える