Je travaille sur la création d'une méthode dynamique à l'exécution pour copier un objet. Supposons:Reflection.Emit - IL - méthode d'appel sur l'objet
class Source
{
public List<int> L1 {get;set;}
}
class Dest
{
public List<int> L1 {get;set;}
}
Maintenant, cette situation fonctionne correctement. Je reçois Source.L1 et je définis Dest.L1. Je le fais avec le IL suivant:
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);
Tout cela fonctionne très bien ... vient maintenant la partie difficile. Changeons Dest à:
class Dest
{
private List<int> _l1 = new List<int>();
public List<int> L1 {get { return _l1; } }
}
Maintenant ce que je veux faire dans ce cas est d'appeler Dest.L1.Clear() puis Dest.L1.AddRange (...).
Je n'arrive même pas à faire fonctionner le .Clear.
j'aurai encore:
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);
Comment dois-je mettre en place l'IL dans le bloc TODO? J'ai essayé de faire dup/loadArg0/appelez miGetter/appelez miClear, mais cela m'a donné un programme invalide.
Pourquoi voulez-vous appeler 'clear'? n'êtes-vous pas en train de créer un nouveau 'Dest'? Ce serait vide lors de la construction. –
Voir la 2ème version de Dest down lower. L1 est maintenant une collection en lecture seule, donc vous ne pouvez pas appeler le setter (bien, vous pouvez, mais vous ne devriez pas) – SledgeHammer
Ce n'est pas ma question. Lorsque vous créez un nouveau 'Dest', la liste' L1' est vide. Vous devez appeler 'AddRange', mais vous n'avez pas besoin d'appeler' Clear' en premier. –