Một số cách bổ sung để chạy với mã kéo. Giả sử bạn có một lớp tương tự
public class Encoder() {
public void Markdown(IEnumerable<FooContent> contents) { do magic }
public void Markdown(IEnumerable<BarContent> contents) { do magic2 }
}
Giả sử trong thời gian chạy bạn có FooContent
Nếu bạn có thể liên kết vào thời gian biên dịch, bạn sẽ muốn
var fooContents = new List<FooContent>(fooContent)
new Encoder().Markdown(fooContents)
Tuy nhiên bạn không thể làm điều này trong thời gian chạy. Để làm điều này trong thời gian chạy, bạn sẽ làm theo dòng:
var listType = typeof(List<>).MakeGenericType(myType);
var dynamicList = Activator.CreateInstance(listType);
((IList)dynamicList).Add(fooContent);
Để tự động gọi Markdown(IEnumerable<FooContent> contents)
new Encoder().Markdown( (dynamic) dynamicList)
Lưu ý việc sử dụng dynamic
trong cuộc gọi phương thức. Trong thời gian chạy dynamicList
sẽ List<FooContent>
(ngoài ra cũng vậy IEnumerable<FooContent>
) vì ngay cả việc sử dụng động vẫn bắt nguồn từ một ngôn ngữ được gõ mạnh, chất kết dính thời gian chạy sẽ chọn Markdown
phương thức thích hợp . Nếu không có loại khớp chính xác, nó sẽ tìm một phương thức tham số đối tượng và nếu không khớp với ngoại lệ liên kết thời gian chạy sẽ được đưa ra cảnh báo rằng không có phương thức nào khớp.
Điểm thu hút rõ ràng của phương pháp này là sự mất mát lớn về an toàn kiểu tại thời điểm biên dịch. Tuy nhiên, mã dọc theo các dòng này sẽ cho phép bạn hoạt động theo một nghĩa rất năng động rằng tại thời gian chạy vẫn được gõ đầy đủ như bạn mong đợi.