107 votes

dynamic ne contient pas de définition d'une propriété à partir d'une référence de projet

J'obtiens une erreur qui dit que l '"objet" ne contient pas une définition pour 'Titre'

tout le code est également sur github

J'ai un ConsoleApplication1 qui ressemble à ceci

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

et Film.cs

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

il fonctionne très bien à partir du MÊME projet, mais si j'ajoute ConsoleApplication2 avec une référence à ConsoleApplication1 et ajouter exactement le même code

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

J'obtiens une erreur "objet" ne contient pas une définition pour 'Titre' même si c'est dans la dynamique de l'objet

  • o.Le titre 'o.Titre " a déclenché une exception de type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException " dynamique {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException}

Voici une capture d'écran. enter image description here

Je suis en train de faire quelque chose comme cela et d'essayer d'appeler la fonction de film à partir d'un projet de test.

merci

166voto

Robert Važan Points 399

La réponse de Jahamal ne dit pas pourquoi vous obtenez l'erreur. La raison en est que la classe anonyme est privée pour l'assembly. Le mot clé dynamic ne vous permet pas de contourner la visibilité des membres. La solution consiste à remplacer la classe anonyme par la classe publique nommée.

95voto

JamahalSOF Points 306

Vous devez utiliser un ExpandoObject

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X