Ese código es falso fatalmente.
Eso lo hace Trabaje, siempre y cuando especifique esa propiedad:
void Bar()
{
Foo(new {Position = 0});
}
void Foo(dynamic args)
{
Console.WriteLine(args.Position);
}
Eso saldrá 0
, no tirará un RuntimeBinderException
.
Pero el propósito de dicho código es la posibilidad de que la persona que llama especifique solo las propiedades necesarias y omiten el resto.
Estás tratando de comprobar esta omisión a través de if(args.Position != null)
. Pero eso no funciona, ya lo requiere. Position
existir.
Cuando eche un vistazo a la API de enrutamiento de ASP.NET que también admite los objetos de configuración anónimos que notará que el tipo de parámetro es object
y no dynamic
.
Utilizando object
en lugar de dynamic
permitirá que su API se use a través de los límites de montaje.
¿Entonces, cómo funciona?
Al igual que en la respuesta vinculada, debe crear manualmente un diccionario de las propiedades. Si usas un viejo claro Dictionary<string, object>
o un ExpandoObject
Es una cuestión de preferencia.
Utilizando ExpandoObject
Hará que su código sea un poco más sencillo para leer y escribir, pero no se requiere.
Sobre la excepción real que está recibiendo:
Tenga en cuenta que le dice que no puede encontrar el Position
propiedad en object
. Si sería un tipo anónimo que faltaba el Position
Propiedad El mensaje de excepción no se referiría a object
Pero a un tipo anónimo. Algo como esto:
'<>f__AnonymousType0'
no contiene una definición para 'posición'