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

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

  

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

и Movie.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' **

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

  • o.Title 'o.Title' вызвал исключение типа 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' dynamic {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException}

Вот снимок экрана: введите описание изображения здесь

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

72 голоса | спросил eiu165 23 FebruaryEurope/MoscowbThu, 23 Feb 2012 19:32:48 +0400000000pmThu, 23 Feb 2012 19:32:48 +040012 2012, 19:32:48

3 ответа


0

Вам необходимо использовать ExpandoObject

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

 Console.WriteLine(m.PrintMovie(o));
ответил JamahalSOF 23 FebruaryEurope/MoscowbThu, 23 Feb 2012 20:40:50 +0400000000pmThu, 23 Feb 2012 20:40:50 +040012 2012, 20:40:50
0
В ответе

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

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

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

  

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

     

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

     
  1. Вы возвращаете непубличный, не внутренний тип, используя System.Object.
  2.   
  3. Вы возвращаете непубличный, не внутренний производный тип через открытый базовый тип и получаете доступ к свойству в производном типе, которого нет в базовом типе.
  4.   
  5. Вы возвращаете все, что находится внутри анонимного типа, из другой сборки.
  6.   
ответил Robert Važan 20 MarpmThu, 20 Mar 2014 22:55:36 +04002014-03-20T22:55:36+04:0010 2014, 22:55:36
0

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

[сборка: InternalsVisibleTo ( "MyDataLayerAssemblyName")]

И это решило это.

Пример:

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

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

   [TestClass]
   public class ContactTests
   {
      ...

Литература: Класс InternalsVisibleToAttribute

Сборки друзей

ответил Jelgab 16 PMpThu, 16 Apr 2015 22:46:19 +030046Thursday 2015, 22:46:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132