Stavo scrivendo un test unitario su un pezzo di codice che restituiva JSON. Il tipo che restituisce è un tipo anonimo, quindi ho pensato di verificare i valori su di esso, avrei semplicemente lanciato l'oggetto su un dynamic
per fare le mie affermazioni.
Tuttavia, quando lo faccio, la mia compilazione fallisce ma non ho alcun messaggio di errore. Sono stato in grado di riprodurre questo con un codice molto semplice in un nuovo progetto di unit test:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
Vedi sotto per uno screenshot della build fallita
La compilazione ha esito positivo quando commento un'asserzione:
Al contrario, ho eseguito il seguente codice in LinqPad 5 beta (che utilizza il compilatore Roslyn) e non ho avuto problemi:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
Vero
Cosa sta succedendo qui? Dal momento che l'errore non viene visualizzato, non posso dire se sto usando in dynamic
modo errato, o se non riesco a trovare il sovraccarico da utilizzare a IsTrue()
causa del dynamic
, o se questo è un bug nel compilatore (anche se ne dubito fortemente , Non ho alcuna prova che ci sia qualcosa di sbagliato nel mio codice).
Per quanto riguarda il problema di sovraccarico, ho provato Assert.IsTrue((bool)asDynamic.someValue);
ma la build non riesce ancora, ancora nessun messaggio di errore.
Per il commento di @ RonBeyer, avevo anche provato più casting come di seguito senza alcun risultato:
dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
A un esame più attento, ho scoperto che c'era un errore elencato nella finestra Output:
c: ... \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): errore CS0656: membro del compilatore mancante richiesto 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
Va bene, VS2013 è migliore nel segnalare gli errori, cercherò in base a quelli:
Va bene, l' aggiunta di un riferimento a Microsoft.CSharp ha risolto l'errore di compilazione , ma lascerò aperta questa domanda perché presumibilmente è un problema con VS2015 che (nella mia mente) dovrebbe essere risolto.
dynamic asDynamic = (dynamic)obj;
? O semplicemente nell'Asserzione, commenta la dinamica e scrivi Assert.IsTrue(((dynamic)obj).someValue);
.
Assert.IsTrue((bool)asDynamic.someValue);
?