Pergunta

É possível clonar um objeto, quando ele é conhecido por ser um ValueType encaixotado, sem escrever código clone tipo específico?

Alguns código para referência

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

A questão partical que eu tenho é com uma máquina de instrução virtual baseado pilha de valores. (E eu estou com preguiça de escrever typeof (int) typeof (DateTime) ....)

update Eu acho que eu me confuso (e algumas outras pessoas). A solução de trabalho que eu tenho é;

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());
Foi útil?

Solução

Eu não sei, se eu não entenderam totalmente a questão.
Você está tentando fazer isso?

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]);
}

Outras dicas

Cada atribuição de um valuetype é por definição um clone.

Editar:

Quando boxe um valuetype uma cópia do seu valuetype será contido em uma instância de uma referenceType.

Dependendo do método de clonagem, não prevejo qualquer diferença.

Você pode usar um hack usando Convert.ChangeType:

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

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

O resultado é cópia do valor em caixa no novo objeto.

Por que você precisa clonagem código de qualquer maneira? Tipos de valor deve geralmente ser de qualquer maneira imutável e isso não é alterado pelo boxe. Portanto, um tipo de valor bem concebido tem nenhuma exigência para clonagem.

    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;
    }

Embora eu faço questão a necessidade de qualquer um, dado que um tipo de valor deve ser imutável.

Se você fosse para converter o objeto para ValueType, que não iria causar um clone a ser feita? Este poderia então ser reembalado:

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

Então, eu acho que eu diria uma metodologia clone eficaz seria:

object clone = (ValueType) boxed;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top