Ich erhalte eine Fehlermeldung, die besagt:
'Objekt' enthält keine Definition für 'Titel'
Der gesamte Code ist auch auf Github
Ich habe eine ConsoleApplication1, die so aussieht
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));
}
}
}
und Movie.cs
public class Movie : DynamicObject
{
public string PrintMovie(dynamic o)
{
return string.Format("Title={0} Rating={1}", o.Title, o.Rating);
}
}
Es funktioniert gut aus dem gleichen Projekt, aber wenn ich ConsoleApplication2 mit einem Verweis auf ConsoleApplication1 hinzufüge und den exakt gleichen Code hinzufüge
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));
}
}
}
Ich erhalte eine Fehlermeldung:
'Objekt' enthält keine Definition für 'Titel' **
obwohl es im dynamischen Objekt ist.
- o.Title 'o.Title' hat eine Ausnahme vom Typ 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' ausgelöst. dynamic {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException}
Hier ist ein Screenshot:
Ich mache so etwas und versuche, die Filmfunktion aus einem Testprojekt aufzurufen.
c#
.net
dynamic
dynamicobject
eiu165
quelle
quelle
Antworten:
Sie müssen ein ExpandoObject verwenden
quelle
Jahamals Antwort sagt nicht, warum Sie den Fehler erhalten. Der Grund ist, dass die anonyme Klasse
internal
zur Assembly gehört. Mit dem Schlüsselwortdynamic
können Sie die Sichtbarkeit von Mitgliedern nicht umgehen.Die Lösung besteht darin, die anonyme Klasse durch eine benannte öffentliche Klasse zu ersetzen.
Hier ist ein weiteres gutes Beispiel, das den Grund und eine andere mögliche Lösung erklärt .
quelle
dynamic
können in einer Testklasse mit Mitgliedern unterschiedlicher Sichtbarkeit überprüft werden.In meinem Fall hatte ich ein Unit-Test-Projekt, das ich in Visual Studio erstellt habe, und viele Fälle, in denen ich Methoden in einer Datenschichtbibliothek testen musste. Ich wollte nicht alle ändern, also habe ich die Testbaugruppe als Freund markiert, indem ich Folgendes verwendet habe:
[assembly:InternalsVisibleTo("MyDataLayerAssemblyName")]
Und das hat es gelöst.
Beispiel:
Verweise:
quelle
In meinem Fall habe ich ein xUnit-Testprojekt.
Wobei 'Inhalt' eine JSON-Zeichenfolge ist .
Dieser Code löst einen Fehler aus:
Dieser Code funktioniert. Verwenden Sie ExpandoObject wie folgt:
quelle