2009-07-09 28 views
5

tôi muốn đạt được một cái gì đó như thế này trong C# 3.5:Làm thế nào để đặt một ràng buộc giao diện trên một phương pháp chung trong C# 3.5?

public void Register<T>() : where T : interface {} 

tôi có thể làm điều đó với lớp học hoặc struct, nhưng làm thế nào để làm điều đó với một giao diện?

+1

Duplicate của http://stackoverflow.com/questions/1096568/how-can-i-use-interface- as-ac-generic-type-constraint –

Trả lời

4

C# và CLR không hỗ trợ các ràng buộc giao diện tổng thể, mặc dù bạn có thể hạn chế nó với một giao diện cụ thể (xem các câu trả lời khác). Gần nhất bạn có thể nhận được là 'lớp' và kiểm tra các loại bằng cách sử dụng phản ánh tại thời gian chạy tôi sợ. Tại sao bạn muốn một ràng buộc giao diện ở nơi đầu tiên?

+0

Đối với tùy chỉnh/điên thực hiện tiêm phụ thuộc, có thể. Nhưng đó là tôi đoán. – Felype

6

Nếu bạn đang yêu cầu về việc thêm một hạn chế đối với một giao diện cụ thể, đó là đơn giản:

public void Register<T>(T data) where T : ISomeInterface 

Nếu bạn đang tự hỏi liệu một từ khóa tồn tại như lớp học hoặc struct để hạn chế phạm vi của các loại có thể cho T, mà không có sẵn.

Trong khi bạn có thể viết:

public void Register<T>(T data) where T : class // (or struct) 

bạn không thể viết:

public void Register<T>(T data) where T : interface 
0

Bạn không thể yêu cầu T đó là một giao diện, vì vậy bạn sẽ phải sử dụng phản ánh vào thời gian chạy để khẳng định điều này.

0

Nếu có thể, tôi đã đi với một giải pháp như thế này. Nó chỉ hoạt động nếu bạn muốn một số giao diện cụ thể (ví dụ: các giao diện bạn có quyền truy cập nguồn) được chuyển thành tham số chung, chứ không phải bất kỳ thông số nào.

  • Tôi để giao diện của mình, được đưa vào câu hỏi, kế thừa giao diện trống IInterface.
  • tôi hạn chế các tham số T chung là có IInterface

Trong nguồn, nó trông như thế này:

  • Bất kỳ giao diện bạn muốn được thông qua như là tham số chung:

    public interface IWhatever : IInterface 
    { 
        // IWhatever specific declarations 
    } 
    
  • IIGiao diện:

    public interface IInterface 
    { 
        // Nothing in here, keep moving 
    } 
    
  • Lớp mà bạn muốn đặt các loại khăn:

    public class WorldPieceGenerator<T> where T : IInterface 
    { 
        // Actual world piece generating code 
    } 
    
Các vấn đề liên quan