Trong các ngôn ngữ chức năng (như lisp), bạn sử dụng khớp mẫu để xác định điều gì xảy ra với một thành phần cụ thể trong danh sách. Tương đương trong C # sẽ là một chuỗi các câu lệnh if ... otherif kiểm tra loại phần tử và thực hiện thao tác dựa trên đó. Không cần phải nói, khớp mẫu chức năng hiệu quả hơn so với kiểm tra kiểu thời gian chạy.
Sử dụng đa hình sẽ là một kết hợp gần hơn với khớp mẫu. Nghĩa là, có các đối tượng của danh sách khớp với một giao diện cụ thể và gọi một hàm trên giao diện đó cho từng đối tượng. Một cách khác là cung cấp một loạt các phương thức quá tải, lấy một loại đối tượng cụ thể làm tham số. Phương thức mặc định lấy Object làm tham số của nó.
public class ListVisitor
{
public void DoSomething(IEnumerable<dynamic> list)
{
foreach(dynamic obj in list)
{
DoSomething(obj);
}
}
public void DoSomething(SomeClass obj)
{
//do something with SomeClass
}
public void DoSomething(AnotherClass obj)
{
//do something with AnotherClass
}
public void DoSomething(Object obj)
{
//do something with everything els
}
}
Cách tiếp cận này cung cấp một xấp xỉ để khớp mẫu Lisp. Mẫu khách truy cập (như được triển khai ở đây, là một ví dụ tuyệt vời về việc sử dụng cho các danh sách không đồng nhất). Một ví dụ khác là gửi tin nhắn trong đó, có người nghe cho một số tin nhắn trong hàng đợi ưu tiên và sử dụng chuỗi trách nhiệm, người điều phối chuyển tin nhắn và trình xử lý đầu tiên khớp với tin nhắn xử lý nó.
Mặt trái là thông báo cho tất cả những người đăng ký tin nhắn (ví dụ: mẫu Tổng hợp sự kiện thường được sử dụng để ghép lỏng ViewModels trong mẫu MVVM). Tôi sử dụng cấu trúc sau
IDictionary<Type, List<Object>>
Cách duy nhất để thêm vào từ điển là một chức năng
Register<T>(Action<T> handler)
(và đối tượng thực sự là một WeakReference cho người được truyền trong handler). Vì vậy, ở đây tôi PHẢI sử dụng Danh sách <Object> vì tại thời điểm biên dịch, tôi không biết kiểu đóng sẽ là gì. Tuy nhiên, tại Runtime tôi có thể thực thi rằng Loại đó sẽ là chìa khóa cho từ điển. Khi tôi muốn khởi động sự kiện, tôi gọi
Send<T>(T message)
và một lần nữa tôi giải quyết danh sách. Không có lợi thế nào khi sử dụng Danh sách <động> vì dù sao tôi cũng cần truyền nó. Vì vậy, như bạn thấy có những giá trị cho cả hai phương pháp. Nếu bạn định tự động gửi một đối tượng bằng cách sử dụng Phương thức nạp chồng, thì động là cách để thực hiện. Nếu bạn bị ép buộc bỏ bất kể, cũng có thể sử dụng Object.