Tôi đã viết một bài kiểm tra đơn vị trên một đoạn mã trả về JSON. Loại mà nó trả về là một loại ẩn danh, vì vậy tôi nghĩ để xác minh các giá trị trên đó, tôi chỉ cần đưa đối tượng đến dynamic
để thực hiện các xác nhận của mình.
Tuy nhiên, khi tôi làm điều đó, bản dựng của tôi thất bại nhưng tôi không có bất kỳ thông báo lỗi nào. Tôi đã có thể tái tạo điều này với mã rất đơn giản trong Dự án thử nghiệm đơn vị mới:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
Xem bên dưới để chụp ảnh màn hình của bản dựng không thành công
Việc xây dựng thành công khi tôi nhận xét khẳng định mặc dù:
Ngược lại, tôi đã chạy đoạn mã sau trong LinqPad 5 beta (sử dụng trình biên dịch Roslyn) và không gặp vấn đề gì:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
Thật
Những gì đang xảy ra ở đây? Vì lỗi không hiển thị nên tôi không thể biết mình đang sử dụng dynamic
không chính xác hay là do không thể tìm thấy sự quá tải để sử dụng IsTrue()
vì dynamic
hoặc đây là lỗi trong trình biên dịch (mặc dù tôi rất nghi ngờ điều này , Tôi không có bất kỳ bằng chứng nào cho thấy có gì đó không đúng với mã của tôi).
Liên quan đến vấn đề quá tải, tôi đã thử Assert.IsTrue((bool)asDynamic.someValue);
nhưng quá trình xây dựng vẫn thất bại, vẫn không có thông báo lỗi.
Theo nhận xét của mỗi @ RonBeyer, tôi cũng đã thử nhiều lần casting hơn như dưới đây nhưng không có kết quả:
dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
Khi kiểm tra kỹ hơn, tôi thấy rằng có một lỗi được liệt kê trong cửa sổ đầu ra:
c: ... \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): lỗi CS0656: Thiếu trình biên dịch yêu cầu thành viên 'Microsoft.CSharp.R nbBinder.CSharpArgumentInfo.Create'
Được rồi, VS2013 tốt hơn trong việc báo cáo lỗi, tôi sẽ tìm kiếm dựa trên những lỗi đó:
Được rồi, việc thêm một tham chiếu đến Microsoft.CSharp đã sửa lỗi xây dựng , nhưng tôi sẽ bỏ ngỏ câu hỏi này vì có lẽ đó là một vấn đề với VS2015 mà (theo tôi) nên được giải quyết.
dynamic asDynamic = (dynamic)obj;
không Hoặc chỉ trong phần Xác nhận, nhận xét động và viết Assert.IsTrue(((dynamic)obj).someValue);
.
Assert.IsTrue((bool)asDynamic.someValue);
?