He estado jugando con algunas declaraciones C# en LINQPad con el fin de comprender qué código de lenguaje intermedio se emite.El tipo dinámico C# hace que Console.WriteLine se resuelva con reflejo en IL
primera vez que trató el siguiente código:
var Container = new {Name = "James"};
Console.WriteLine(Container.Name);
y vio las siguientes seis líneas de IL emitidos:
IL_0001: ldstr "James"
IL_0006: newobj <>f__AnonymousType0<System.String>..ctor
IL_000B: stloc.0
IL_000C: ldloc.0
IL_000D: callvirt <>f__AnonymousType0<System.String>.get_Name
IL_0012: call System.Console.WriteLine
Lo cual, es en términos generales lo que espero, y es bastante una buena demostración de cómo los tipos anónimos son de solo lectura/inmutables, ya que no hay una propiedad set_Name.
Después probé las declaraciones:
dynamic Container = new System.Dynamic.ExpandoObject();
Container.Name = "James";
Console.WriteLine(Container.Name);
lo que provoca una gran cantidad de IL ser emitida. No lo pegaré aquí, pero lo puedes encontrar en this pastebin.
Entiendo que hay bastante sobrecarga con respecto a la administración del tipo dinámico y ExpandoObject, pero no entiendo por qué parece que la llamada al System.Console.WriteLine
se realiza en este caso a través de la reflexión interna.
IL_0072: ldstr "WriteLine"
....
IL_00BF: ldtoken System.Console
En el primer segmento de código, después de la propiedad fue recuperado y almacenado, fue una declaración IL de una línea que invoca System.Console.WriteLine
.
Entonces, ¿por qué se requiere todo esto adicional para la llamada con un tipo dynamic
?
En realidad, su truco 'ToString()' no funcionará (a menos que también agregue un molde explícito a 'cadena'). – svick
@svick Estás en lo correcto, actualizado en consecuencia. – Servy