2016-04-07 27 views
6

Tôi có một giao diện với các phương pháp chú thích với thuộc tính Pure từ System.Diagnostics.Contracts:Kiểm tra nếu Generic Giao diện Thành viên là "tinh khiết" (có thuộc tính tinh khiết)

public interface IFoo<T> { 
    [Pure] 
    T First { get; } 

    [Pure] 
    T Last { get; } 

    [Pure] 
    T Choose(); 

    void Add(T item); 

    T Remove(); 
} 

Tôi muốn để lặp qua các thành viên của giao diện và kiểm tra nếu thành viên là thuần khiết hay không. Hiện tại tôi không thể nhận bất kỳ thuộc tính nào từ thông tin thành viên:

var type = typeof(IFoo<>); 
var memberInfos = type.GetMembers(); 
var memberInfo = memberInfos.First(); // <-- Just select one of them 
var attributes = memberInfo.GetCustomAttributesData(); // <-- Empty 

Tôi đang thiếu gì?

Lưu ý rằng tôi không có lớp học hoặc ví dụ tại đây. Chỉ có giao diện.

+0

Kiểm tra điều này - http://stackoverflow.com/questions/540749/can-a-c-sharp-class-inherit-attributes-from-its-interface Bạn có thể muốn xem xét lại các thuộc tính trên giao diện của mình. – Wjdavis5

+0

Nhưng đó không phải là câu hỏi về các lớp kế thừa các thuộc tính? Tôi ** chỉ ** muốn xem giao diện và các thành viên ** của nó **. –

+0

@ Wjdavis5 Và tôi không thực sự có bất kỳ triển khai nào để xem, chỉ các giao diện. –

Trả lời

3

Sử dụng trình giải mã tùy chọn và mở lắp ráp của bạn. Bạn sẽ thấy rằng PureAttribute sẽ bị xóa bởi trình biên dịch. Vì vậy, bạn không thể có được nó với sự phản ánh bởi vì không tồn tại nữa.

Để kiểm tra, bạn có thể sử dụng một thuộc tính khác sẽ không bị xóa và bạn sẽ có thể lấy nó bằng cách sử dụng sự phản chiếu.

Cập nhật: Một mặt, như bạn đã đề cập trong các ý kiến:

tinh khiết là một thuộc tính có điều kiện ([Conditional ("CONTRACTS_FULL")]), và chỉ được bổ sung nếu hợp đồng được bật.

Mặt khác, mã của bạn có lỗi do phương thức Linqs First() sẽ trả về thành viên không có thuộc tính, phương thức getter của thuộc tính. Bạn có thể sử dụng mã như thế này để có được kết quả mong đợi: members.Where(x => x.GetCustomAttributes<PureAttribute>().Any()).ToArray().

+0

Ok, tôi hiểu rồi. Đó là trong thực tế đi. Sau đó, hãy cho tôi biết: Làm thế nào để Code Contracts biết nếu một phương thức thuần túy hay không? –

+0

Thành thật mà nói, tôi không biết, có thể có một trình biên dịch khác hoặc được sửa đổi chút ít được sử dụng. – thehennyy

+0

Ồ, đợi đã. Pure là thuộc tính có điều kiện ('[Conditional (" CONTRACTS_FULL ")]') và chỉ được thêm nếu hợp đồng được bật. Thuộc tính này thực sự có thể nhìn thấy trong assembly (sử dụng dotPeeks) nếu CC được kích hoạt - tuy nhiên, chúng vẫn không hiển thị với sự phản chiếu. –

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