2010-02-19 10 views
6

Tôi có một Dictionary(TKey, TValue) nhưAnonymous loại

Dictionary<int, ArrayList> Deduction_Employees = 
    new Dictionary<int, ArrayList>(); 

và sau đó tôi thêm vào rằng danh sách mảng một loại vô danh như thế này

var day_and_type = new { 
    TheDay = myDay, 
    EntranceOrExit = isEntranceDelay 
}; 

Deduction_Employees[Employee_ID].Add(day_and_type); 

Bây giờ làm thế nào tôi có thể Unbox rằng var và truy cập các tính ??

+4

Câu hỏi lớn là tại sao bạn muốn? Bạn đang cố gắng đạt được điều gì? – pdr

Trả lời

13

Trước tiên, bạn không mở hộp kiểu này. Các loại ẩn danh là các kiểu tham chiếu, không phải là các cấu trúc.

Mặc dù bạn về mặt kỹ thuật có thể tạo thể hiện của cùng loại bên ngoài của phương pháp họ đã khai báo trong (theo phần 7.5.10.6 của C# 3.0 Ngôn ngữ kỹ thuật, trong đó nêu:

Trong chương trình tương tự , hai ẩn danh initializers đối tượng mà chỉ định một chuỗi tài sản của cùng tên và thời gian biên dịch các loại trong cùng một trật tự sẽ tạo ra trường hợp của cùng loại vô danh.

) bạn không có cách nào để lấy tên loại mà bạn cần để thực hiện dàn diễn viên từ Object quay lại loại bạn đã tạo. Bạn sẽ phải sử dụng một số cast-by-example solution vốn vốn không hoàn thiện.

Cast-by-example là thiếu sót vì từ quan điểm thiết kế, mọi nơi bạn muốn truy cập loại bên ngoài hàm được khai báo (và vẫn ở trong cùng một mô-đun), bạn phải khai báo hiệu quả kiểu trên lần nữa.

Đó là một bản sao nỗ lực dẫn đến thiết kế và triển khai cẩu thả.

Nếu bạn đang sử dụng .NET 4.0, khi đó bạn có thể đặt đối tượng đối tượng vào biến động. Tuy nhiên, nhược điểm chính là việc thiếu xác minh thời gian biên dịch truy cập thành viên. Bạn có thể dễ dàng viết sai tên của thành viên và sau đó bạn gặp lỗi thời gian chạy thay vì lỗi biên dịch.

Cuối cùng, nếu bạn thấy cần sử dụng loại ẩn danh bên ngoài phương pháp được khai báo, thì giải pháp tốt nhất là tạo loại bê tông và thay thế loại ẩn danh cho loại bê tông.

1

Không, bạn không thể. Bạn chỉ có thể truy cập các thuộc tính bằng cách sử dụng sự phản chiếu. Trình biên dịch không có cách nào để biết loại đó là gì, và vì nó là một kiểu ẩn danh, bạn không thể bỏ nó.

1

Nếu bạn đang sử dụng .NET 1.x - 3.x, bạn phải sử dụng sự phản chiếu.

Nếu bạn sử dụng .NET 4.0, bạn có thể sử dụng loại động và gọi thuộc tính mong muốn.

Trong cả hai trường hợp, bạn cần phải bỏ hộp; đó là cho các loại giá trị. Các loại ẩn danh luôn là các loại tham chiếu.

3

Loại ẩn danh có phạm vi phương thức. Để chuyển một kiểu ẩn danh, hoặc một bộ sưu tập chứa các kiểu ẩn danh, bên ngoài một đường biên của phương thức, trước tiên bạn phải truyền kiểu này sang đối tượng. Tuy nhiên, điều này đánh bại việc gõ mạnh mẽ của loại vô danh. Nếu bạn phải lưu trữ kết quả truy vấn của bạn hoặc vượt qua chúng bên ngoài ranh giới phương pháp, hãy xem xét sử dụng cấu trúc hoặc lớp được đặt tên thông thường thay vì loại ẩn danh.

Nguồn: http://msdn.microsoft.com/en-us/library/bb397696.aspx

8

Có một số cách.

Vì nhận xét dường như chỉ ra rằng tôi đề nghị bạn làm điều này, hãy để tôi làm rõ: Bạn nên tạo một loại có tên cho đối tượng của mình vì bạn định truyền nó đi.

Trước tiên, bạn có thể sử dụng Phản chiếu, câu trả lời khác ở đây đã chỉ ra. Một cách khác, thủ thuật .NET đưa cho bạn đúng loại được gọi là "đúc theo ví dụ", và nó đi một cái gì đó như thế này: Bạn cần phải vượt qua đối tượng của bạn thông qua một cuộc gọi phương thức chung, mà sẽ trả về đối tượng là loại phù hợp, bằng cách suy ra loại quyền trả về.

Ví dụ, hãy thử này:

private static T CastByExample<T>(T example, object value) 
{ 
    return (T)value; 
} 

và sử dụng nó:

var x = CastByExample(new { TheDay = ??, EntranceOrExit = ?? }, obj); 

cho hai ?? các điểm, bạn chỉ cần vượt qua một cái gì đó phù hợp với kiểu dữ liệu cho các thuộc tính đó, các giá trị sẽ không được sử dụng.

Điều này khai thác thực tế là nhiều loại ẩn danh chứa cùng một thuộc tính giống nhau, cùng loại, theo thứ tự, trong cùng một cụm, sẽ ánh xạ tới cùng một loại.

Tuy nhiên, do thời gian này, bạn nên tạo một loại được đặt tên thay thế.

+0

+1 Chỉ cần thấy nhận xét đó trên msdn và mặc dù khai thác nó như thế nào - "Nếu hai hoặc nhiều kiểu ẩn danh có cùng số lượng và loại thuộc tính theo thứ tự như nhau, trình biên dịch xử lý chúng như cùng loại và chia sẻ cùng một trình biên dịch thông tin kiểu được tạo. " – Kobi

+0

@Lasse V. Karlsen: Cuối cùng, từng ví dụ là một trò hề. Bạn đang khai báo lại hiệu quả loại tại mỗi địa điểm bên ngoài phương thức trong mô-đun mà bạn muốn truy cập vào nó, vi phạm các nguyên tắc cơ bản của việc tái sử dụng. – casperOne

+0

Rất đẹp, nhưng nó cảm thấy rất khó xử. Hầu như điều ác :) –