6

コンパイル時(または実行時)に認識されていないオブジェクトのクローンを作成する方法を検討しています。質問の正確な言い回しは、「任意のオブジェクトのクローンを作成できる関数を作成する」です。

  • 不明なオブジェクトを関数に渡します。
  • オブジェクトのディープコピーを返します。

リフレクションを使用して関数と変数を読み取り、次に新しいオブジェクトを作成してこれらの値を割り当てる必要があると思います。Type.GetType()を使用してタイプを検索し、新しいインスタンスを作成してから、この既知のオブジェクトのコピーコンストラクターを使用できます。しかし、特定のクラスに実装されるかどうか(Deep)、または質問がそのような解決策を求めているかどうかはわかりません(必要な結果が何であるかがわからないので役に立ちません!)。

これを達成するために、誰かが私を正しい方向に導き、クラス/インターフェースが必要であり、寛大であると感じている場合は擬似コードを教えてもらえますか?

4

2 に答える 2

4

単純SerializeDeserializeオブジェクトを作成してクローンを作成できます。
次の関数はそれを行います:

public object Clone(object obj)
{
    MemoryStream ms = new MemoryStream();
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(ms, obj);
    ms.Position = 0;
    object obj_clone = bf.Deserialize(ms);
    ms.Close();
    return obj_clone;
}
于 2012-09-04T12:11:14.407 に答える
2

これは、

Type newObjectType = orgObject.GetType()

次に、Activator.CreateInstance(newObjectType)を呼び出します。次に、オブジェクトのすべてのプロパティをループして、新しいオブジェクトに設定する必要があります。これは、リフレクションを介して行うこともできます。

orgObject.GetType()。GetProperties()の各PropertyInfoをループし、新しいオブジェクトに値を設定します。

これにより、オブジェクトのタイプに関係なく、オブジェクトの「深い」コピーが実際に作成されます。

編集:私が上で説明した方法のテストされていないコード例。

Type newObjectType = orgObject.GetType();
object newObject = Activator.CreateInstance(newObjectType);

foreach (var propInfo in orgObject.GetType().GetProperties())
{
    object orgValue = propInfo.GetValue(orgObject, null);

    // set the value of the new object
    propInfo.SetValue(newObject, orgValue, null);
}

あなたがいくつかの明快さを得たことを願っています!

于 2012-09-04T12:11:22.207 に答える