Voy a resumir mi problema en el siguiente fragmento de código.
List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 };
Console.WriteLine(list.First());
El código anterior funciona bien.
Ahora probé lo siguiente
dynamic dList = list;
Console.WriteLine(dList.First());
pero obtengo RuntimeBinderException. ¿Por qué es así?
this
aquí es dinámico, pero si aterrizas aquí, probablemente también deberías mirar esa preguntaRespuestas:
Para ampliar la respuesta de Stecya ... los métodos de extensión no son compatibles con la escritura dinámica en forma de métodos de extensión , es decir, llamados como si fueran métodos de instancia. Sin embargo, esto funcionará:
Por supuesto, eso puede ser útil o no. Si pudiera brindar más información sobre por qué y cómo está tratando de utilizar la escritura dinámica, es posible que podamos ayudarlo más.
fuente
dynamic
donde realmente lo necesite ... básicamente, si de lo contrario accedería a los miembros con reflexión, esa es una gran señal. Por otro lado, soy un mecanografista estático empedernido; otros pueden sugerir políticas menos pesimistas :)Para ampliar la respuesta de Jon, la razón por la que esto no funciona es porque en los métodos de extensión de código no dinámicos normales funcionan haciendo una búsqueda completa de todas las clases conocidas por el compilador para una clase estática que tiene un método de extensión que coincide. La búsqueda va en orden según la anidación del espacio de nombres y la disponibilidad
using
directivas en cada espacio de nombres.Eso significa que para que una invocación de método de extensión dinámica se resuelva correctamente, de alguna manera el DLR tiene que saber en tiempo de ejecución cuáles
using
eran todos los anidamientos y directivas del espacio de nombres en su código fuente . No tenemos un mecanismo útil para codificar toda esa información en el sitio de la llamada. Consideramos inventar un mecanismo de este tipo, pero decidimos que era un costo demasiado alto y generaba demasiado riesgo de programación para que valiera la pena.fuente
dynamic
objetos son iguales a C #:,DynamicObject
por lo que no hay forma de diferenciarlos y es una de las razones por las que no es posible agregar métodos de extensióndynamic
, ¿verdad?Porque
First()
no es un método deList
. Se define en Linq Extension paraIEnumerable<>
fuente