Я писал unit test на фрагменте кода, который возвращал JSON. Тип, который он возвращает, является анонимным типом, поэтому я решил проверить значения на нем. Я просто применил объект к dynamic
для выполнения моих утверждений.
Однако, когда я это делаю, моя сборка выходит из строя, но у меня нет сообщений об ошибках. Я смог воспроизвести это с помощью очень простого кода в новом проекте unit test:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
Ниже приведен снимок экрана с ошибкой сборки
Строка завершается успешно, когда я комментирую это утверждение:
В отличие от этого, я запускал следующий код в бета-версии LinqPad 5 (который использует компилятор Roslyn) и не имел проблем:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
True
Что здесь происходит? Поскольку ошибка не отображается, я не могу сказать, неправильно ли я использую dynamic
, или если он не может найти перегрузку, используемую для IsTrue()
из-за dynamic
, или если это ошибка в компиляторе (хотя я очень сомневаюсь в этом, у меня нет никаких доказательств того, что с моим кодом что-то не так).
Что касается проблемы с перегрузкой, я пробовал Assert.IsTrue((bool)asDynamic.someValue);
, но сборка все еще терпит неудачу, но не появляется сообщение об ошибке.
В комментарии @RonBeyer я также пробовал больше кастинга, например ниже, безрезультатно:
dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
При ближайшем рассмотрении я обнаружил, что в окне вывода произошла ошибка:
c:...\DynamicBuildFailTest\UnitTest1.cs(16,33,16,42): ошибка CS0656: отсутствует компилятор, требуемый член 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
Хорошо, VS2013 лучше сообщать об ошибках, я буду искать на основе этих:
Хорошо, добавив ссылку на Microsoft.CSharp исправил ошибку сборки, но я оставлю этот вопрос открытым, потому что это, по-видимому, проблема с VS2015, которая (на мой взгляд ) должны быть разрешены.