Recibo un error que dice:
'objeto' no contiene una definición de 'Título'
todo el código también está activado github
Tengo una ConsoleApplication1 que se ve así
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Movie m = new Movie();
var o = new { Title = "Ghostbusters", Rating = "PG" };
Console.WriteLine(m.PrintMovie(o));
}
}
}
y Movie.cs
public class Movie : DynamicObject
{
public string PrintMovie(dynamic o)
{
return string.Format("Title={0} Rating={1}", o.Title, o.Rating);
}
}
funciona bien desde el MISMO proyecto, pero si agrego ConsoleApplication2 con una referencia a ConsoleApplication1 y agrego exactamente el mismo código
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Movie m = new Movie();
var o = new { Title = "Ghostbusters", Rating = "PG" };
Console.WriteLine(m.PrintMovie(o));
}
}
}
Me sale un error:
'objeto' no contiene una definición de 'Título' **
aunque esté en el objeto dinámico.
- o.Title 'o.Title' arrojó una excepción de tipo 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' dynamic {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException}
Aquí hay una captura de pantalla:
Estoy haciendo algo como esto e intento llamar a la función de película desde un proyecto de prueba.
c#
.net
dynamic
dynamicobject
eiu165
fuente
fuente
Respuestas:
Necesitas usar un ExpandoObject
dynamic o = new ExpandoObject(); o.Title = "Ghostbusters"; o.Rating = "PG"; Console.WriteLine(m.PrintMovie(o));
fuente
La respuesta de Jahamal no dice por qué aparece el error. La razón es que la clase anónima es
internal
para la asamblea. Palabra clavedynamic
no le permite eludir la visibilidad de los miembros.La solución es reemplazar la clase anónima con una clase pública nombrada.
Aquí hay otro buen ejemplo que explica el motivo y otra posible solución .
fuente
dynamic
se pueden verificar en una clase de prueba con miembros de diferente visibilidad.En mi caso, tuve un proyecto de prueba unitaria que creé en Visual Studio y muchos casos en los que necesitaba probar métodos en una biblioteca de capas de datos. No quería cambiarlos todos, así que marqué el ensamblaje de prueba como amigo usando:
[assembly:InternalsVisibleTo("MyDataLayerAssemblyName")]
Y eso lo resolvió.
Ejemplo:
using System.Runtime.CompilerServices; using Microsoft.VisualStudio.TestTools.UnitTesting; [assembly: InternalsVisibleTo( "MyDataLayerAssembly" )] namespace MyUnitTestProject.DataTests { [TestClass] public class ContactTests { ...
Referencias:
fuente
En mi caso, tengo un proyecto de prueba xUnit.
Donde 'contenido' es una cadena json .
Este código arroja un error:
dynamic parsed = JsonConvert.DeserializeObject<dynamic>(content);
Este código funciona. Use ExpandoObject en lugar de una dinámica como esta:
dynamic parsed = JsonConvert.DeserializeObject<ExpandoObject>(content);
fuente