ฉันกำลังเขียนการทดสอบหน่วยในโค้ดที่ส่งคืน JSON ประเภทที่ส่งคืนเป็นชนิดไม่ระบุชื่อดังนั้นฉันคิดว่าจะตรวจสอบค่าที่อยู่บนมันฉันแค่โยนวัตถุไปที่ a dynamic
เพื่อยืนยัน
อย่างไรก็ตามเมื่อฉันทำอย่างนั้นงานสร้างของฉันล้มเหลว แต่ฉันไม่มีข้อความแสดงข้อผิดพลาด ฉันสามารถทำซ้ำสิ่งนี้ด้วยรหัสที่ง่ายมากในโครงการทดสอบหน่วยใหม่:
[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);
?