read net functions example dynamically create c# .net dynamic dynamicobject

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

Asambleas de amigos


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 de data2 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 un System.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 llamada Person 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 a data.Name funciona bien ya que Person 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):

  1. Está devolviendo un tipo no público, no interno utilizando System.Object .
  2. 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.
  3. 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));