Я писав одиничний тест на фрагменті коду, який повернув JSON. Тип, який він повертає, - це анонімний тип, тому я думав перевірити значення на ньому, я би просто кинув об'єкт на а, dynamic
щоб зробити свої твердження.
Однак коли я це роблю, моя збірка не вдається, але у мене немає жодних повідомлень про помилки. Мені вдалося відтворити це за допомогою дуже простого коду в новому проектному проекті Unit:
[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());
Правда
Що тут відбувається? Оскільки помилка не відображається, я не можу сказати, чи використовую я 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, яку (на мій погляд) слід вирішити.
dynamic asDynamic = (dynamic)obj;
? Або просто у твердженні прокоментуйте динаміку та напишіть Assert.IsTrue(((dynamic)obj).someValue);
.
Assert.IsTrue((bool)asDynamic.someValue);
?