Estou recebendo um erro que diz:
'objeto' não contém uma definição para 'Título'
todo o código também está no github
Eu tenho um ConsoleApplication1 que se parece com este
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));
}
}
}
e Movie.cs
public class Movie : DynamicObject
{
public string PrintMovie(dynamic o)
{
return string.Format("Title={0} Rating={1}", o.Title, o.Rating);
}
}
funciona bem no MESMO projeto, mas se eu adicionar ConsoleApplication2 com uma referência a ConsoleApplication1 e adicionar o mesmo código exato
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));
}
}
}
Recebo um erro:
'objeto' não contém uma definição para 'Título' **
mesmo que esteja no objeto dinâmico.
- o.Title 'o.Title' gerou uma exceção do tipo 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' dynamic {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException}
Aqui está uma captura de tela:
Estou fazendo algo assim e tentando chamar a função de filme de um projeto de teste.
c#
.net
dynamic
dynamicobject
eiu165
fonte
fonte
Respostas:
Você precisa usar um ExpandoObject
fonte
A resposta de Jahamal não diz por que você obteve o erro. O motivo é que a classe anônima é
internal
para a montagem. A palavra-chavedynamic
não permite que você ignore a visibilidade do membro.A solução é substituir a classe anônima pela classe pública nomeada.
Aqui está outro bom exemplo que explica o motivo e outra solução possível .
fonte
dynamic
podem ser verificadas em uma classe de teste com membros de visibilidade variável.No meu caso, tive um projeto de Teste de Unidade que criei no Visual Studio e vários casos em que precisei testar métodos em uma biblioteca de camada de dados. Eu não queria mudar todos eles, então marquei a montagem de teste como um amigo usando:
[assembly:InternalsVisibleTo("MyDataLayerAssemblyName")]
E isso resolveu.
Exemplo:
Referências:
fonte
No meu caso, tenho um projeto de teste xUnit.
Onde 'conteúdo' é uma string json .
Este código gera erro:
Este código funciona. Use ExpandoObject em vez de dinâmico como este:
fonte