dynamique ne contient pas une définition pour une propriété à partir d'un projet de référence
J'obtiens une erreur qui dit:
'objet' ne contient pas une définition pour 'Titre'
tout le code est également sur github
J'ai un ConsoleApplication1 qui ressemble à ce
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:
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.
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser un ExpandoObject
Jahamal de réponse ne veut pas dire pourquoi vous obtenez le message d'erreur. La raison en est que la classe anonyme est
internal
à l'assemblée. Mot-clédynamic
ne vous permettra pas de contourner les membres de la visibilité.La solution est de remplacer la classe anonyme nommés classe publique.
Voici un autre bon exemple pour expliquer les raisons et une autre solution possible.
dynamic
peut être vérifié sur une classe de test avec des membres de différentes visibilité.Dans mon cas, j'ai eu un projet de Test d'Unité que j'ai créé sur Visual Studio et un grand nombre de cas où j'ai besoin de tester des méthodes sur une couche de données de la bibliothèque. Je ne voulais pas changer tous donc j'ai marqué le test de l'assemblée, comme à un ami, en utilisant:
[assembly:InternalsVisibleTo("MyDataLayerAssemblyName")]
Et que résolu.
Exemple:
Références:
InternalsVisibleToAttribute Classe
Ami Assemblées