Ich arbeite an der Erstellung einer dynamischen Methode zur Laufzeit ein Objekt zu kopieren. Nehmen wir an:Reflection.Emit - IL - Aufrufmethode für Objekt
class Source
{
public List<int> L1 {get;set;}
}
class Dest
{
public List<int> L1 {get;set;}
}
Jetzt funktioniert diese Situation richtig. Ich bekomme Source.L1 und ich setze Dest.L1. Ich mache so mit dem folgenden IL:
All dies funktioniert gut ... jetzt kommt der schwierige Teil. Lässt ändern Dest zu:
class Dest
{
private List<int> _l1 = new List<int>();
public List<int> L1 {get { return _l1; } }
}
Nun, was ich in diesem Fall tun möchte, ist anrufen Dest.L1.Clear() und dann Dest.L1.AddRange (...).
Ich kann nicht einmal die .Clear arbeiten.
Ich werde noch haben:
generator.Emit(OpCodes.Newobj, constructor);
// this block is repeated 5 times for various properties
generator.Emit(OpCodes.Dup);
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Callvirt, miGetter);
generator.Emit(OpCodes.Callvirt, miSetter);
// List property will be copied here
// miGetter = Dest.L1.Get
// TODO
// end list property
generator.Emit(OpCodes.Ret);
Wie muss ich die IL in der TODO Block einzurichten? Ich habe versucht, dup/loadArg0/call miGetter/call miClear, aber das gab mir ein ungültiges Programm.
Warum wollen Sie 'Clear' anrufen? Erschaffst du nicht ein neues 'Dest'? Es wäre leer beim Bau. –
Siehe die zweite Version von Dest down lower. L1 ist jetzt eine Nur-Lese-Sammlung, also kannst du den Setter nicht anrufen (naja, du kannst, aber solltest du nicht) – SledgeHammer
Das ist nicht meine Frage. Wenn Sie ein neues 'Dest' erstellen, ist die' L1'-Liste leer. Sie müssen 'AddRange' aufrufen, müssen aber nicht zuerst' Clear' aufrufen. –