Frage

Ist es möglich, ein Objekt zu klonen, wenn es bekannt ist ein boxed Valuetype sein, ohne zu schreiben typspezifischen Klon-Code?

Einige Code als Referenz

List<ValueType> values = new List<ValueType> {3, DateTime.Now, 23.4M};
DuplicateLastItem(values);

Das partical Problem, das ich habe, ist mit einer Wert Stack-basierten virtuellen Maschine Anweisung. (Und Im zu faul typeof schreiben (int) typeof (Datetime) ....)

Update Ich glaube, ich verwirrt mich (und ein paar andere Leute). Die Arbeitslösung die ich habe ist;

List<ValueType> values = new List<ValueType> { 3, DateTime.Now, 23.4M }; 

// Clone
values.Add(values[values.Count() - 1]);

// Overwrite original
values[2] = 'p';

foreach (ValueType val in values)
   Console.WriteLine(val.ToString());
War es hilfreich?

Lösung

Ich weiß nicht, ob ich völlig habe die Frage falsch verstanden.
Sind Sie versuchen, dies zu tun?

public static void Main()
{
    List<ValueType> values = new List<ValueType> {3, DateTime.Now, 23.4M};
    DuplicateLastItem(values);

    Console.WriteLine(values[2]);
    Console.WriteLine(values[3]);
    values[3] = 20;
    Console.WriteLine(values[2]);
    Console.WriteLine(values[3]);
}

static void DuplicateLastItem(List<ValueType> values2)
{
    values2.Add(values2[values2.Count - 1]);
}

Andere Tipps

Jede Zuordnung eines Valuetype per Definition ist ein Klon.

Edit:

Wenn ein Valuetype eine Kopie Ihrer Valuetype Boxen wird in einer Instanz einer Reference enthalten sein.

In Abhängigkeit von der Cloning-Methode, ich voraussehen keine Unterschiede.

Sie können einen Hack Convert.ChangeType verwenden:

object x = 1;
var type = x.GetType();
var clone = Convert.ChangeType(x, type);

// Make sure it works
Assert.AreNotSame(x, clone);

Das Ergebnis ist Kopie des Wertes in neuem Objekt umrandet.

Warum klonen Sie müssen Code überhaupt? Werttypen sollte in der Regel unveränderlich sein sowieso, und dies wird nicht durch Boxen verändert. Daher ist ein gut gestalteter Werttyp keine Anforderung für das Klonen hat.

    private static T CloneUnboxed<T>(object o) where T : struct
    {
        return (T)o;
    }

    private static object CloneBoxed<T>(object o) where T : struct
    {
        return (object)(T)o;
    }

Auch wenn ich die Notwendigkeit, entweder nicht in Frage, da ein Werttyp sollte unveränderlich sein.

Wenn Sie das Objekt zu Valuetype zu werfen, wäre, dass ein Klon nicht dazu führen werden? Dies könnte dann Umgepackte werden:

int i = 3;
object b = i; // box it
ValueType c = (ValueType) b; // unbox it
object d = c; // box it, effectively creating a clone

Also, ich glaube, ich würde eine effektive Klon-Methode sagen wäre:

object clone = (ValueType) boxed;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top