2013-04-01 20 views
17

Tôi có một lớp học có nguồn gốc từ một lớp trừu tượng. Bắt một loại của một lớp dẫn xuất tôi muốn tìm ra các thuộc tính được thừa kế từ lớp trừu tượng và được khai báo trong lớp dẫn xuất.Làm thế nào để tìm hiểu xem tài sản được thừa kế từ một lớp cơ sở hoặc khai báo trong nguồn gốc?

public abstract class BaseMsClass 
{ 
    public string CommonParam { get; set; } 
} 

public class MsClass : BaseMsClass 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 

    public MsClass() 
    { } 
} 

var msClass = new MsClass 
{ 
    Id = "1122", 
    Name = "Some name", 
    CommonParam = "param of the base class" 
}; 

Vì vậy, tôi muốn nhanh chóng tìm ra rằng CommonParam là tham số được thừa hưởng và Id, Tên là thông số được khai báo trong MsClass. Bất kỳ đề xuất?

Cố gắng để sử dụng tuyên bố chỉ cờ trả tôi trống rỗng PropertyInfo mảng

Type type = msClass.GetType(); 
type.GetProperties(System.Reflection.BindingFlags.DeclaredOnly) 

-->{System.Reflection.PropertyInfo[0]} 

Tuy nhiên, GetProperties() trả về tất cả các đặc tính của hệ thống phân cấp thừa kế.

type.GetProperties() 

-->{System.Reflection.PropertyInfo[3]} 
-->[0]: {System.String Id} 
-->[1]: {System.String Name} 
-->[2]: {System.String CommonParam} 

Tôi có bỏ lỡ điều gì đó không?

Trả lời

26

Bạn có thể chỉ định Type.GetProperties(BindingFlags.DeclaredOnly) để nhận các thuộc tính được xác định trong lớp dẫn xuất. Nếu sau đó bạn gọi GetProperties trên lớp cơ sở, bạn có thể nhận được các thuộc tính được định nghĩa trong lớp cơ sở.


Để lấy tài sản công cộng từ lớp học của bạn, bạn có thể làm:

var classType = typeof(MsClass); 
var classProps = classType.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public); 
var inheritedProps = classType.BaseType.GetProperties(BindingFlags.Public | BindingFlags.Instance); 
+3

Bằng cách nào đó phương pháp này không mang lại kết quả mong đợi. Câu hỏi được cập nhật. – Maxim

+2

@Maxim bạn cần 'type.GetProperties (BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public)'. +1 cho Reed, hy vọng anh ấy sẽ cập nhật câu trả lời một chút –

+0

@Maxim Đã thêm một số mã ... –

10

Bạn có thể kiểm tra dựa trên DeclaringType như sau:

var pros = typeof(MsClass).GetProperties() 
          .Where(p => p.DeclaringType == typeof(MsClass)); 

Để có được tính từ lớp cơ sở bạn có thể gọi tương tự:

var pros = typeof(MsClass).GetProperties() 
          .Where(p => p.DeclaringType == typeof(BaseMsClass)); 
3

Điều này có thể giúp:

Type type = typeof(MsClass); 

Type baseType = type.BaseType; 

var baseProperties = 
    type.GetProperties() 
      .Where(input => baseType.GetProperties() 
            .Any(i => i.Name == input.Name)).ToList(); 
+0

+1 Chắc chắn hoạt động, không phải là rất thanh lịch mặc dù. Dự kiến ​​rằng một cái gì đó nên được thực hiện để hỗ trợ yêu cầu yêu cầu. – Maxim

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