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}
вот снимок экрана: 
Я что-то делаю как это и пытается вызвать функцию movie из тестового проекта.
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является открытым классом, что информация доступна и может быть легко решена.это может повлиять на вас в любом из следующих случаев (если не больше):
- вы возвращаете непубличный, не внутренний тип с помощью
System.Object.- вы возвращаете непубличный, не внутренний производный тип через открытый базовый тип и получаете доступ к свойству в производном типе, который не находится в базовом типе.
- вы возвращаете все, что завернуто внутри анонимного типа из другой сборки.
в моем случае у меня был проект модульного теста, который я создал в Visual Studio, и много случаев, когда мне нужно было протестировать методы в библиотеке уровня данных. Я не хотел менять все из них, поэтому я отметил тестовую сборку как друга, используя:
[assembly:InternalsVisibleTo ("MyDataLayerAssemblyName")]
и это решило проблему.
пример:
using System.Runtime.CompilerServices; using Microsoft.VisualStudio.TestTools.UnitTesting; [assembly: InternalsVisibleTo( "MyDataLayerAssembly" )] namespace MyUnitTestProject.DataTests { [TestClass] public class ContactTests { ...
Comments