C'est un exercice d'apprentissage. J'ai créé une méthode qui prend une foo et une chaîne et définit la propriété une propriété. J'ai utilisé le démontage du réflecteur pour effectuer le code d'émission suivant. Le démontage ressemble à ceci: OK, alors j'ai modélisé mon code d'émit après cela: P> JIT Compiler encountered an internal limitation.
3 Réponses :
Quelle version de .NET a-t-elle besoin d'exécuter? Compiler un délégué d'un arbre d'expression serait beaucoup plus facile. P>
En .NET 3.5 Vous ne pouvez pas faire d'affectation dans des arbres d'expression.
Eh puisque tout ce qu'il fait, c'est appeler une méthode de setter que vous pourriez le faire dans .NET 3.5 aussi. Il suffit d'aller expression.call (cible, SetMethod, valeurExpression) code>. Ça apparaîtra comme
cible.set_property (valeur) code> dans la totring mais cela fonctionne.
Eh bien, je l'ai compris. Changer à p> corrigé. Je ne sais pas pourquoi le démontage a montré Callvirt, mais Eh. P> P>
Quelle version de .net? Dans .net4, il donne une exception de sécurité pour essayer d'appeler une méthode située sur une instance.
problème intéressant. Tout d'abord, il y a peu de choses que vous pouvez faire. Si vous voulez seulement un délégué pour le Setter, vous pouvez utiliser délégué.createdélégate code>.
DynamicMethod method = new DynamicMethod("Setter", typeof(void), new[] { typeof(Foo), typeof(string) }, true);
var ilgen = method.GetILGenerator();
ilgen.Emit(OpCodes.Ldarg_0);
ilgen.Emit(OpCodes.Ldarg_1);
ilgen.Emit(OpCodes.Callvirt, typeof(Foo).GetProperty("A").GetSetMethod());
ilgen.Emit(OpCodes.Ret);
var action = method.CreateDelegate(typeof(Action<Foo,string>)) as Action<Foo,string>;
Vous accédez à la méthode "get_"; Est-ce juste une faute de frappe dans votre message? Notez que vous pouvez accéder à la propriété par nom et utiliser la méthode getSetMethod () sur l'objet de propriétéInfo; De cette façon, vous ne comptez pas sur la convention C # de "get_" et "set_".
Je l'ai cependant fait, corrigez une faute de frappe tout simplement. L'IL contient Astr, au lieu d'un, parce que j'avais renommé la propriété aux fins de ce poste.
Ah, j'ai mal interprété la première phrase de votre commentaire. Vous avez absolument raison.
Je ne pense pas que la cible soit privée, car cela ressemble à une propriété publique pour moi. Cependant, vous devez associer la dynamicmethod avec la bonne classe, actuellement accès à des méthodes privées de programme code> code> et non de
foo code>.