Một số thêm làm thế nào để chạy với kéo mã. Giả sử bạn có một lớp học tương tự như
public class Encoder() {
public void Markdown(IEnumerable<FooContent> contents) { do magic }
public void Markdown(IEnumerable<BarContent> contents) { do magic2 }
}
Giả sử khi chạy bạn có một FooContent
Nếu bạn đã có thể để ràng buộc tại thời gian biên dịch bạn muốn
var fooContents = new List<FooContent>(fooContent)
new Encoder().Markdown(fooContents)
Tuy nhiên bạn không thể thực hiện việc này khi chạy. Để làm điều này khi chạy bạn sẽ làm gì dọc 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 lời gọi phương thức. Khi thời gian chạy dynamicList
sẽ là List<FooContent>
(ngoài ra cũng là IEnumerable<FooContent>
) vì ngay cả việc sử dụng động vẫn bắt nguồn từ ngôn ngữ được nhập mạnh, trình kết nối thời gian chạy sẽ chọn phương thức thích hợp Markdown
. Nếu không có kết quả khớp chính xác, nó sẽ tìm kiếm một phương thức tham số đối tượng và nếu không khớp với một ngoại lệ kết nối thời gian chạy sẽ được cảnh báo rằng không có phương thức nào phù hợp.
Sự rút ngắn rõ ràng về phương pháp này là mất mát lớn về an toàn loại lúc biên dịch. Tuy nhiên, mã theo các dòng này sẽ cho phép bạn vận hành theo nghĩa rất năng động khi thời gian chạy vẫn được gõ đầy đủ như bạn mong đợi.
Nguồn
2014-10-14 19:10:30
Generics! = Templates. Tất cả các biến kiểu generic được giải quyết tại thời gian biên dịch và không phải lúc chạy. Đây là một trong những tình huống mà loại 'động' của 4.0 có thể hữu ích. – Will
@Will - theo cách nào? Khi được sử dụng với generics, theo CTP hiện tại bạn về cơ bản cuối cùng gọi các phiên bản
@MarcGravell bạn có thể sử dụng 'foo.Method ((dynamic) myGenericClass)' cho phương thức thời gian chạy ràng buộc, hiệu quả mô hình định vị dịch vụ cho quá tải phương thức của một loại. –