J'écrivais un test unitaire sur un morceau de code qui retournait JSON. Le type qu'il renvoie est un type anonyme, j'ai donc pensé que pour vérifier les valeurs dessus, je viens de convertir l'objet en a dynamic
pour faire mes assertions.
Cependant, lorsque je fais cela, ma construction échoue mais je n'ai aucun message d'erreur. J'ai pu reproduire cela avec un code très simple dans un nouveau projet de test unitaire:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
Voir ci-dessous pour une capture d'écran de l'échec de la construction
La construction réussit quand je commente l'assertion:
En revanche, j'ai exécuté le code suivant dans LinqPad 5 beta (qui utilise le compilateur Roslyn) et je n'ai eu aucun problème:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
Vrai
Que se passe t-il ici? Étant donné que l'erreur ne s'affiche pas, je ne peux pas dire si j'utilise de dynamic
manière incorrecte, ou s'il ne trouve pas la surcharge à utiliser à IsTrue()
cause de dynamic
, ou s'il s'agit d'un bogue dans le compilateur (bien que je doute fortement de cela , Je n'ai aucune preuve qu'il y a un problème avec mon code).
En ce qui concerne le problème de surcharge, j'ai essayé Assert.IsTrue((bool)asDynamic.someValue);
mais la construction échoue toujours, toujours pas de message d'erreur.
Selon le commentaire de @ RonBeyer, j'avais également essayé plus de casting comme ci-dessous en vain:
dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
En y regardant de plus près, j'ai trouvé une erreur répertoriée dans la fenêtre Sortie:
c: ... \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): erreur CS0656: membre requis du compilateur manquant 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
D'accord, VS2013 est meilleur pour signaler les erreurs, je vais chercher en me basant sur celles-ci:
D'accord, l' ajout d'une référence à Microsoft.CSharp a corrigé l'erreur de construction , mais je vais laisser cette question ouverte car c'est probablement un problème avec VS2015 qui (dans mon esprit) devrait être résolu.
dynamic asDynamic = (dynamic)obj;
? Ou juste dans l'assertion, commentez la dynamique et écrivez Assert.IsTrue(((dynamic)obj).someValue);
.
Assert.IsTrue((bool)asDynamic.someValue);
?