Я получаю сообщение об ошибке:
'объект' не содержит определения для 'Заголовка'
весь код тоже на 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));
}
}
}
Я получаю сообщение об ошибке:
'объект' не содержит определения для 'Заголовка' **
даже если он находится в динамическом объекте.
- o.Title 'o.Title' вызвало исключение типа 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' dynamic {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException}
Вот скриншот:
Я делаю что-то подобное и пытаюсь вызвать функцию фильма из тестового проекта.
c#
.net
dynamic
dynamicobject
eiu165
источник
источник
Ответы:
Вам нужно использовать ExpandoObject
dynamic o = new ExpandoObject(); o.Title = "Ghostbusters"; o.Rating = "PG"; Console.WriteLine(m.PrintMovie(o));
источник
В ответе Джахамаля не говорится, почему вы получаете ошибку. Причина в том, что анонимный класс относится
internal
к сборке. Ключевое словоdynamic
не позволяет вам обойти видимость участников.Решение состоит в том, чтобы заменить анонимный класс именованным публичным классом.
Вот еще один хороший пример, объясняющий причину и другое возможное решение .
источник
dynamic
могут быть проверены на тестовом классе с членами различной видимости.В моем случае у меня был проект модульного теста, который я создал в Visual Studio, и множество случаев, когда мне нужно было протестировать методы в библиотеке уровня данных. Мне не хотелось менять их все, поэтому я пометил тестовую сборку как друга, используя:
[assembly:InternalsVisibleTo("MyDataLayerAssemblyName")]
И это решило ее.
Пример:
using System.Runtime.CompilerServices; using Microsoft.VisualStudio.TestTools.UnitTesting; [assembly: InternalsVisibleTo( "MyDataLayerAssembly" )] namespace MyUnitTestProject.DataTests { [TestClass] public class ContactTests { ...
Ссылки:
источник
В моем случае у меня есть тестовый проект xUnit.
Где «контент» - это строка в формате json .
Этот код выдает ошибку:
dynamic parsed = JsonConvert.DeserializeObject<dynamic>(content);
Этот код работает. Используйте ExpandoObject вместо dynamic следующим образом:
dynamic parsed = JsonConvert.DeserializeObject<ExpandoObject>(content);
источник