2015-07-07 13 views
5

Chúng tôi đã tạo cấu trúc để kết hợp các số nguyên và giá trị dài từ DB, do đó chúng có thể được xử lý một cách rõ ràng dưới dạng ID bằng trình chuyển đổi Json (với trình chuyển đổi tùy chỉnh chuyên dụng).Thời gian chạy ẩn ngầm từ đối tượng

Vấn đề là chúng ta đọc dữ liệu này từ một Dictionary<string, object> mà thực sự là một đối tượng DataRow -like nơi phần string là tên của cột và object phần là giá trị.

Vì vậy trước chúng tôi đã có mã này để đọc các giá trị:

int myVal = (int)row["COLUMN"] 

Chúng tôi muốn mã này tiếp tục làm việc cũng sau những thay đổi này.

Nhưng kể từ row["COLUMN"]object (@ biên dịch-thời gian) diễn viên ngầm không thành công, mặc dù nó thực sự là một Id32 (@ thời gian chạy).

Sau đây rõ ràng là hoạt động:

int myVal = (Id32)row["COLUMN"] 

Nhưng có một số người cách để sửa chữa này mà không sửa đổi mã mà đọc giá trị?

Đây là mã struct:

public struct Id32 
{ 
    public readonly int Value; 

    public Id32(int id) { this.Value = id; } 

    public static implicit operator int(Id32 id) { return id.Value; } 

    public static implicit operator Id32(int id) { return new Id32(id); } 
} 
+0

Xem thêm: http://stackoverflow.com/questions/1611083/will-the-c-sharp-compiler-perform-multiple-implicit-conversions-to-get-from-one –

+0

Câu hỏi này là về chuyển đổi tiềm ẩn , không phải phôi. Mặc dù việc cast có liên quan (bạn có một 'object' và nó cần được cast thành' int', có thể bên trong một chuyển đổi ngầm từ 'object' được định nghĩa trên' Id32'). – binki

Trả lời

2

Theo tôi không phải là một giải pháp rất đàng hoàng, nhưng nó hoạt động (hy vọng có những giải pháp tốt hơn): nếu bạn sử dụng dynamic loại cơ bản được xác định trên thời gian chạy , do đó, việc kiểm tra kiểu với diễn viên ngầm sẽ hoạt động.

Mã Tôi đã sử dụng:

dynamic o = new Id32(1); 
// dynamic o = row["COLUMN"]; in your case 

int myVal = (int)o; 

Nếu bạn thay đổi dynamic-object bạn sẽ có tình hình hiện tại của bạn, mà thất bại.

+1

Điều này thật thú vị. Nhưng tôi không thực sự biết nếu nó có thể tuyên bố một 'Từ điển ' ... Tôi sẽ cung cấp cho nó một thử. – Teejay

+0

Không, nhưng nó được chuyển đổi tại thời điểm đó (nếu bạn làm điều này trước khi thêm vào từ điển), do đó, nó không quan trọng. –

+0

Thật không may, theo cách đó, chúng tôi cần sửa đổi mã để đọc giá trị. – Teejay

3

Tôi nghĩ rằng điều này là không thể với ràng buộc không sửa đổi truy xuất mãint myVal = (int)row["COLUMN"] của bạn.

Bạn sẽ cần phải thêm một dàn diễn viên tiềm ẩn vào object (đến int) không thể thực hiện được. Có rất nhiều cách để làm cho dàn diễn viên của riêng bạn đơn giản nhưng tất cả mọi người tôi có thể nghĩ ra hoặc bạn sẽ tìm thấy như here đòi hỏi phải thay đổi dòng đó.

Thậm chí nếu bạn không thay đổi, tôi đoán bạn sẽ phải biên dịch lại nó - vì vậy nếu bạn biên dịch lại nó, tại sao bạn không thay đổi nó? Có một số công cụ tái cấu trúc mà nên làm cho hàng ngàn dòng đó khá dễ dàng.

+0

Cảm ơn sự đóng góp của bạn. – Teejay

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