Aufbauend auf Marcs Antwort, aber mit dem gewünschten Klonverhalten
public static T[] CloneSubArray<T>(this T[] data, int index, int length)
where T : ICloneable
{
T[] result = new T[length];
for (int i = 0; i < length; i++)
{
var original = data[index + i];
if (original != null)
result[i] = (T)original.Clone();
return result;
}
Und wenn die Implementierung von ICloneable zu anstrengend ist, kann eine reflektierende Lösung mit Håvard Strandens kopierbare Bibliothek um die erforderlichen schweren Arbeiten zu erledigen.
using OX.Copyable;
public static T[] DeepCopySubArray<T>(
this T[] data, int index, int length)
{
T[] result = new T[length];
for (int i = 0; i < length; i++)
{
var original = data[index + i];
if (original != null)
result[i] = (T)original.Copy();
return result;
}
Beachten Sie, dass die OX.Copyable-Implementierung mit jedem von funktioniert:
Damit die automatische Kopie funktioniert, muss jedoch eine der folgenden Aussagen zutreffen:
- Sein Typ muss einen parameterlosen Konstruktor haben, oder
- Es muss ein Copyable sein, oder
- Es muss ein IInstanceProvider für seinen Typ registriert sein.
Das sollte also fast jede Situation abdecken. Wenn Sie Objekte klonen, bei denen der Subgraph Dinge wie DB-Verbindungen oder Datei-/Stream-Handles enthält, haben Sie natürlich Probleme, aber das gilt für jede verallgemeinerte Deep Copy.
Wenn Sie stattdessen einen anderen Deep-Copy-Ansatz verwenden möchten Artikel listet mehrere andere auf Ich würde daher vorschlagen, dass Sie nicht versuchen, Ihre eigenen Texte zu schreiben.