Я работаю над созданием динамического метода во время выполнения для копирования объекта. Предположим:
class Source
{
public List<int> L1 {get;set;}
}
class Dest
{
public List<int> L1 {get;set;}
}
Теперь эта ситуация работает корректно. Я получаю Source.L1 и устанавливаю Dest.L1. Я делаю это со следующим IL:
generator.Emit(OpCodes.Newobj, constructor);
generator.Emit(OpCodes.Dup);
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Callvirt, miGetter);
generator.Emit(OpCodes.Callvirt, miSetter);
generator.Emit(OpCodes.Ret);
Все это работает нормально... теперь самое сложное. Давайте изменим Dest на:
class Dest
{
private List<int> _l1 = new List<int>();
public List<int> L1 {get { return _l1; } }
}
Теперь то, что я хочу сделать в этом случае, это вызвать Dest.L1.Clear(), а затем Dest.L1.AddRange(...).
Я даже не могу заставить работать .Clear.
У меня еще будет:
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);
Как мне настроить IL в блоке TODO? Я попытался выполнить dup/loadArg0/call miGetter/call miClear, но это дало мне недопустимую программу.
Clear
? ты не создаешь новыйDest
? При строительстве он будет пуст. - person Yacoub Massad   schedule 08.04.2016Dest
, списокL1
пуст. Вам нужно позвонитьAddRange
, но не обязательно сначала звонитьClear
. - person Yacoub Massad   schedule 08.04.2016