2011-03-18 41 views
5

Có ai khác cảm thấy rằng nó có thể hữu ích nếu thời gian chạy cho phép tham chiếu đến các thành viên của giao diện chung không cụ thể cho loại chung không? Tôi biết "workaround" thông thường là tạo ra một giao diện không chung chung làm cơ sở cho giao diện chung, nhưng có một lý do hợp lệ nào chống lại giao diện cơ bản đó về cơ bản là tự động không?tham chiếu trừu tượng cho giao diện chung

Ví dụ, với giao diện sau:

public interface IProcessor<T> 
{ 
    string Name { get; } 
    void Process(T item); 
} 

Tôi nghĩ rằng nó sẽ được thuận tiện tự động cho phép một cái gì đó như thế này:

public void LogProcessor(IProcessor<> item) 
{ 
     Trace.WriteLine(item.Name); 
} 

Tôi tò mò muốn nghe lý lẽ chống lại điều này (khác hơn là "dừng quá lười và chỉ viết giao diện cơ sở").

+1

Làm thế nào để biết bạn có ý nghĩa gì? –

+1

Dường như để xử lý một tính năng như vậy C# sẽ phải được nhập động. –

+1

Paul Sasik. Mã như vậy sau khi biên dịch có thể tạo ra giao diện cơ sở cho Generics. Và đây là ý tưởng, nhưng có thể gây ra một số vấn đề ... – Evgeny

Trả lời

7

Bạn chỉ có thể sử dụng một phương pháp chung:

public void LogProcessor<T>(IProcessor<T> item) 
{ 
    Trace.WriteLine(item.Name); 
} 
+0

Tôi có thể, nhưng những gì về một bối cảnh mà tôi không biết T là gì? Ví dụ, nếu tôi muốn tải động (và đăng nhập tên) của tất cả các lớp trong một assembly thực hiện giao diện IProcessor <> (tôi có thể kiểm tra giao diện bằng cách sử dụng t.GetInterface (typeof (IProcessor <>). Name) ! = null)? – WuffaloWill

+0

@WuffaloWIll: Bạn có thể kiểm tra cái chung, sau đó sử dụng sự phản chiếu để gọi phương thức chung (với kiểu thích hợp thông qua MethodInfo.MakeGenericMethod: http://msdn.microsoft.com/en-us/library/system.reflection. methodinfo.makegenericmethod.aspx). Nó không đẹp, nhưng nó sẽ hoạt động trong nhiều trường hợp. Tuy nhiên, đối với các API thông thường, nơi bạn không sử dụng sự phản hồi, điều này hoạt động hoàn hảo. –

+0

@ Reed- Cảm ơn bạn đã trả lời. Tôi hiểu cách sử dụng các phương thức chung trong "API bình thường"; Tôi cho rằng tôi nên nói từ câu trả lời ban đầu của mình là "những gì về một bối cảnh mà tôi không _care_ T là gì?" – WuffaloWill

0

Lý do chính tại sao không phải là đặc điểm kỹ thuật ngôn ngữ chung. Và thêm những thứ như vậy là một phần lớn công việc và thử nghiệm cho các nhà phát triển khung microsoft. Vì vậy, nó dễ dàng hơn là thêm giao diện cơ sở. Nhưng dù sao bạn có thể đăng ý tưởng lên diễn đàn microsoft

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