c# - net - dinámico no contiene una definición para una propiedad de una referencia de proyecto
list dynamic object c# (3)
Me aparece un error que dice:
''objeto'' no contiene una definición para ''Título''
todo el código también está en github
Tengo una ConsoleApplication1 que se parece a esto
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 proyecto MISMO, pero si agrego ConsoleApplication2 con una referencia a ConsoleApplication1 y agrego el mismo código Exact
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 para ''Título'' **
a pesar de que está en el objeto dinámico.
- o.Title ''o.Title'' lanzó 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.
En mi caso, tuve un proyecto de prueba de unidad que creé en Visual Studio y muchos casos en los que necesitaba probar métodos en una biblioteca de capa de datos. No quería cambiarlos a todos, así que marqué el ensamblaje de prueba como amigo al usar:
[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: InternalsVisibleToAttribute Class
La respuesta de Jahamal no dice por qué recibes el error. La razón es que la clase anónima es internal
a la asamblea. La dynamic
palabras clave no le permite omitir la visibilidad del miembro.
La solución es reemplazar la clase anónima con clase pública nombrada.
Aquí hay otro buen ejemplo que explica el motivo y otra posible solución .
El motivo por el que falla la llamada a
data2.Person
es que la información de tipo dedata2
no está disponible en tiempo de ejecución. La razón por la que no está disponible es porque los tipos anónimos no son públicos. Cuando el método devuelve una instancia de ese tipo anónimo, devuelve unSystem.Objec
t que hace referencia a una instancia de un tipo anónimo, un tipo cuya información no está disponible para el programa principal. El tiempo de ejecución dinámico intenta encontrar una propiedad llamadaPerson
en el objeto, pero no puede resolverlo a partir de la información de tipo que tiene. Como tal, arroja una excepción. La llamada adata.Name
funciona bien ya quePerson
es una clase pública, esa información está disponible y se puede resolver fácilmente.Esto puede afectarlo en cualquiera de los siguientes casos (si no más):
- Está devolviendo un tipo no público, no interno utilizando
System.Object
.- Está devolviendo un tipo derivado no público, no interno a través de un tipo de base pública y accediendo a una propiedad en el tipo derivado que no está en el tipo base.
- Está devolviendo cualquier cosa envuelta en un tipo anónimo de un ensamblaje diferente.
Necesita usar un ExpandoObject
dynamic o = new ExpandoObject();
o.Title = "Ghostbusters";
o.Rating = "PG";
Console.WriteLine(m.PrintMovie(o));