ฉันกำลังเขียนการทดสอบหน่วยในโค้ดที่ส่งคืน 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);?
                


