2010-01-25 41 views
14

Tôi có một thể hiện của System.Type đại diện cho một giao diện, và tôi muốn có được một danh sách tất cả các thuộc tính trên giao diện đó - bao gồm cả các thuộc tính được thừa kế từ các giao diện cơ bản. Về cơ bản tôi muốn có cùng một hành vi từ các giao diện mà tôi nhận được cho các lớp học.Phản ánh trên tất cả các thuộc tính của giao diện, bao gồm cả các thuộc tính được kế thừa?

Ví dụ, đưa ra hệ thống phân cấp này:

public interface IBase { 
    public string BaseProperty { get; } 
} 
public interface ISub : IBase { 
    public string SubProperty { get; } 
} 
public class Base : IBase { 
    public string BaseProperty { get { return "Base"; } } 
} 
public class Sub : Base, ISub { 
    public string SubProperty { get { return "Sub"; } } 
} 

Nếu tôi gọi GetProperties trên lớp - typeof(Sub).GetProperties() - sau đó tôi nhận được cả hai BaseProperty và SubProperty. Tôi muốn làm điều tương tự với giao diện, nhưng khi tôi thử nó - typeof(ISub).GetProperties() - tất cả những gì trở lại là SubProperty.

Tôi đã cố gắng vượt qua BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy để GetProperties, vì sự hiểu biết của tôi về FlattenHierarchy là nó phải bao gồm các thành viên từ các lớp cơ sở, nhưng hành vi hoàn toàn giống nhau.

Tôi cho rằng tôi có thể lặp Type.GetInterfaces() và gọi GetProperties trên mỗi một, nhưng sau đó tôi sẽ được dựa vào GetProperties trên một giao diện để bao giờ thuộc tính cơ bản trở lại (vì nếu nó bao giờ đã làm, tôi sẽ nhận được bản sao). Tôi không muốn dựa vào hành vi này mà không ít nhất là nhìn thấy nó được ghi lại.

Làm thế nào tôi có thể một trong hai:

  • Nhận một danh sách tất cả các thuộc tính trên một giao diện, bao gồm cả những từ giao diện cơ bản của nó? Hoặc
  • Ít nhất hãy tự tin rằng những gì tôi thấy là hành vi được ghi lại tài liệu mà tôi có thể dựa vào, vì vậy tôi có thể giải quyết nó?
+1

có thể trùng lặp của [GetProperties() để trả về tất cả các thuộc tính cho một hệ thống phân cấp thừa kế giao diện] (http://stackoverflow.com/questions/358835/getproperties-to-return-all-properties-for-an-interface-inheritance -hierarchy) – nawfal

Trả lời

7

Một câu trả lời của các loại là được (tức là nhận được tất cả các giao diện thực hiện.) tìm thấy trong một chú thích để the .NET framework version 3.5-specific MSDN page on GetProperties(BindingFlags bindingFlags):

Đi qua BindingFlags.FlattenHierarchy đến một trong những Typ Các phương thức e.GetXXX, chẳng hạn như Type.GetMembers, sẽ không trả về các thành viên giao diện được kế thừa khi bạn đang truy vấn trên giao diện nhập chính nó.

[...]

Để có được các thành viên kế thừa, bạn cần để truy vấn mỗi giao diện thực hiện cho các thành viên của nó.

Mã ví dụ cũng được bao gồm. Nhận xét này đã được đăng bởi một Microsoft, vì vậy tôi sẽ nói rằng bạn có thể tin tưởng nó.

+0

"Thêm cộng đồng" mà bạn đề cập không được hiển thị cho phiên bản hiện tại của trang đó - bạn phải quay lại phiên bản .Net Framework 3.5. Đây là một liên kết trực tiếp: http://msdn.microsoft.com/en-us/library/kyaxdd3x%28v=vs.90% 29.aspx – RenniePet

+0

@RenniePet cảm ơn, đã cập nhật – AakashM

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