Ich habe einen Komponententest für einen Code geschrieben, der JSON zurückgegeben hat. Der Typ, den es zurückgibt, ist ein anonymer Typ, daher dachte ich, um die Werte darauf zu überprüfen, würde ich das Objekt einfach in a umwandeln dynamic
, um meine Aussagen zu machen.
Wenn ich das mache, schlägt mein Build jedoch fehl, aber ich habe keine Fehlermeldungen. Ich konnte dies mit sehr einfachem Code in einem neuen Unit-Test-Projekt reproduzieren:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
Unten finden Sie einen Screenshot des fehlgeschlagenen Builds
Der Build ist erfolgreich, wenn ich die Behauptung auskommentiere:
Im Gegensatz dazu habe ich den folgenden Code in LinqPad 5 Beta (das den Roslyn-Compiler verwendet) ausgeführt und hatte keine Probleme:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
Wahr
Was ist denn hier los? Da der Fehler nicht angezeigt wird, kann ich nicht feststellen, ob ich ihn dynamic
falsch verwende oder ob die Überlastung IsTrue()
aufgrund des Fehlers nicht gefunden werden kann dynamic
oder ob dies ein Fehler im Compiler ist (obwohl ich dies sehr bezweifle Ich habe keine Beweise dafür, dass etwas mit meinem Code nicht stimmt.
In Bezug auf das Überlastungsproblem habe ich versucht, Assert.IsTrue((bool)asDynamic.someValue);
aber der Build schlägt immer noch fehl, immer noch keine Fehlermeldung.
Per @ RonBeyers Kommentar hatte ich auch mehr Casting wie das folgende versucht, ohne Erfolg:
dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
Bei näherer Betrachtung stellte ich fest, dass im Ausgabefenster ein Fehler aufgeführt war:
c: ... \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): Fehler CS0656: Fehlender Compiler erforderlich Mitglied 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
Okay, VS2013 kann die Fehler besser melden. Ich werde danach suchen:
Okay, das Hinzufügen eines Verweises auf Microsoft.CSharp hat den Erstellungsfehler behoben , aber ich werde diese Frage offen lassen, da es sich vermutlich um ein Problem mit VS2015 handelt, das (meiner Meinung nach) behoben werden sollte.
dynamic asDynamic = (dynamic)obj;
? Oder kommentieren Sie einfach in der Assertion die Dynamik aus und schreiben Sie Assert.IsTrue(((dynamic)obj).someValue);
.
Assert.IsTrue((bool)asDynamic.someValue);
?