dynamic не содержит определения свойства из ссылки на проект



Я получаю ошибку, которая говорит:




'object' не содержит определения для 'Title'




весь код также включен github



У меня есть ConsoleApplication1, который выглядит так



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));
}
}
}


и кино.cs



public class Movie : DynamicObject
{
public string PrintMovie(dynamic o)
{
return string.Format("Title={0} Rating={1}", o.Title, o.Rating);
}
}


он отлично работает из того же проекта, но если я добавлю ConsoleApplication2 со ссылкой на ConsoleApplication1 и добавить точное тот же код



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));
}
}
}


Я получаю сообщение об ошибке:




'object' не содержит определения для 'Title'**




даже если он находится в динамическом объекте.




  • о'.Название 'о'.Название' выбросил исключение типа 'Майкрософт.CSharp.RuntimeBinder.RuntimeBinderException ' dynamic {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException}


вот снимок экрана: enter image description here



Я что-то делаю как это и пытается вызвать функцию movie из тестового проекта.

562   3  

3 ответов:

вам нужно использовать ExpandoObject

 dynamic o = new ExpandoObject();
 o.Title = "Ghostbusters";
 o.Rating = "PG";

 Console.WriteLine(m.PrintMovie(o));

ответ Джахамала не говорит почему вы получаете сообщение об ошибке. Причина в том, что анонимный класс internal ассамблее. Ключевое слово dynamic не позволяет обойти видимость элемента.

решение состоит в том, чтобы заменить анонимный класс с именем public class.

вот еще один хороший пример, объясняющий причину и другое возможное решение.

причина позвонить data2.Person не это информация о типе data2 недоступно во время выполнения. Причина, по которой он недоступен, заключается в том, что анонимные типы не являются общедоступными. Когда метод возвращает экземпляр этого анонимного типа, он возвращает System.Object, который ссылается на экземпляр анонимного типа-Тип, информация о котором недоступна для основной программы. Динамическая среда выполнения пытается найти свойство с именем Person на объекте, но не может разрешить его от информации о типе его. Таким образом, он создает исключение. Звонок в data.Name работает с Person является открытым классом, что информация доступна и может быть легко решена.

это может повлиять на вас в любом из следующих случаев (если не больше):

  1. вы возвращаете непубличный, не внутренний тип с помощью System.Object.
  2. вы возвращаете непубличный, не внутренний производный тип через открытый базовый тип и получаете доступ к свойству в производном типе, который не находится в базовом типе.
  3. вы возвращаете все, что завернуто внутри анонимного типа из другой сборки.

в моем случае у меня был проект модульного теста, который я создал в Visual Studio, и много случаев, когда мне нужно было протестировать методы в библиотеке уровня данных. Я не хотел менять все из них, поэтому я отметил тестовую сборку как друга, используя:

[assembly:InternalsVisibleTo ("MyDataLayerAssemblyName")]

и это решило проблему.

пример:

using System.Runtime.CompilerServices;
using Microsoft.VisualStudio.TestTools.UnitTesting;

[assembly: InternalsVisibleTo( "MyDataLayerAssembly" )]
namespace MyUnitTestProject.DataTests
{

   [TestClass]
   public class ContactTests
   {
      ...

ссылки: InternalsVisibleToAttribute Класс

Друг Сборок

Comments

    Ничего не найдено.