JSON döndüren bir kod parçası üzerinde birim testi yazıyordum. Döndürdüğü tür anonim bir tür, bu yüzden değerlerini doğrulamayı düşündüm, sadece dynamic
iddialarımı yapmak için nesneyi atarım.
Ancak, bunu yaptığımda, derleme başarısız ama herhangi bir hata iletileri yok. Bunu yeni bir Birim Test Projesinde çok basit bir kodla çoğaltabildim:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
Derleme başarısız bir ekran görüntüsü için aşağıya bakın
Olsa da iddiayı yorumlamak yapı başarılı:
Buna karşılık, LinqPad 5 beta'da (Roslyn derleyicisini kullanan) aşağıdaki kodu çalıştırdım ve hiçbir sorun yaşamadım:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
Doğru
Burada neler oluyor? Hata gösterilmediğinden dynamic
, yanlış kullanıp kullanmadığımı veya IsTrue()
nedeniyle kullanmak için aşırı yükü bulamıyorsa dynamic
veya derleyicide bir hata ise (çok şüphe duymama rağmen) söyleyemem , Kodumda bir sorun olduğunu gösteren hiçbir kanıtım yok).
Aşırı yükleme sorunuyla ilgili olarak, denedim Assert.IsTrue((bool)asDynamic.someValue);
ama yapı hala başarısız, hala hata mesajı yok.
@ RonBeyer yorum başına, ben de boşuna aşağıdaki gibi daha fazla döküm denedim:
dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
Daha yakından incelendiğinde, Çıktı penceresinde bir hata olduğunu gördüm:
c: ... \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): hata CS0656: Eksik derleyici gerekli üye 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
Tamam, VS2013 hataları bildirmede daha iyidir, bunlara göre arama yapacağım:
Tamam, Microsoft.CSharp'a bir başvuru ekleyerek derleme hatası düzeltildi , ancak bu soruyu açık bırakacağım çünkü muhtemelen VS2015 ile ilgili bir sorun (aklımda) çözülmesi gerekiyor.
dynamic asDynamic = (dynamic)obj;
misin? Ya da sadece İddia'da, dinamiği yorumlayın ve yazın Assert.IsTrue(((dynamic)obj).someValue);
.
Assert.IsTrue((bool)asDynamic.someValue);
?