2012-03-06 17 views
5

Tôi có một số mã hoạt động với ExpandoObjects được phổ biến bởi các cuộc gọi cơ sở dữ liệu. Luôn luôn một số giá trị là null. Khi tôi nhìn vào các đối tượng như là một ExpandoObject, tôi thấy tất cả các khóa và giá trị (nulls được bao gồm) trong từ điển cơ bản. Nhưng nếu tôi cố gắng truy cập chúng thông qua một tham chiếu động, bất kỳ khóa nào có giá trị null tương ứng sẽ không hiển thị trong chế độ xem động của đối tượng. Tôi nhận được một ArgumentNullException khi tôi cố gắng truy cập nó thông qua cú pháp thuộc tính trên tham chiếu động.Chế độ xem động của ExpandoObjects "ẩn" Thuộc tính với giá trị null

Tôi biết tôi có thể giải quyết vấn đề này bằng cách làm việc trực tiếp với ExpandoObject, thêm một loạt thử, lập bản đồ expando thành một loại cụ thể, v.v. địa điểm đầu tiên. Mã tiêu thụ đối tượng dyanmic sẽ hoạt động tốt nếu một số thuộc tính có giá trị null. Có một cách hay hơn hoặc ngắn gọn của "unhiding" các thuộc tính động có giá trị null?

Dưới đây là mã đó chứng tỏ "vấn đề" của tôi

dynamic dynamicRef = new ExpandoObject(); 
ExpandoObject expandoRef = dynamicRef; 

dynamicRef.SimpleProperty = "SomeString"; 
dynamicRef.NulledProperty = null; 

string someString1 = string.Format("{0}", dynamicRef.SimpleProperty); 

// My bad; this throws because the value is actually null, not because it isn't 
// present. Set a breakppoint and look at the quickwatch on the dynamicRef vs. 
// the expandoRef to see why I let myself be led astray. NulledProperty does not 
// show up in the Dynamic View of the dynamicRef 
string someString2 = string.Format("{0}", dynamicRef.NulledProperty); 
+0

ExpandoObject có thể lưu trữ giá trị null và kéo chúng ra, bạn có chắc chắn điều gì gây ra ngoại lệ đối số không? – jbtule

+1

Nếu khóa hiện diện trong 'ExpandoObject', nó sẽ trả về nó cho dù đó là' null' hay không. Nếu nó không có, nó sẽ ném một 'RuntimeBinderException'. Nó sẽ không ném 'ArgumentNullException', vì vậy phải có một số lỗi trong mã của bạn. Bạn có thể cho chúng tôi thấy mã mà ném không? – svick

+0

OK, tôi nghĩ rằng tôi đang bị lừa bởi cửa sổ xem Visual Studio. Mã này đang ném một ArgumentNullException vì giá trị thực sự là null, không phải vì thuộc tính là "thiếu". Khi tôi đặt đồng hồ trên tham chiếu động, nó không hiển thị thuộc tính nếu nó có giá trị null. Nếu tôi đặt đồng hồ xem tham chiếu ExpandoObject vào cùng một đối tượng, nó sẽ hiển thị tên thuộc tính trong danh sách khóa cơ bản. –

Trả lời

3

Vấn đề bạn đang gặp là các cuộc gọi động quá tải thời gian chạy là chọn string .Format(format, params object[] args) thay vì dành string.Format(string format, object arg0) một dàn diễn viên đơn giản sẽ chuyển sang một invocation tĩnh của string.Format và sửa nó.

string someString2 = string.Format("{0}", (object)dynamicRef.NulledProperty); 
+0

Hoàn hảo! Điều đó đã chăm sóc nó. –

Các vấn đề liên quan