2017-09-13 17 views
11

Tôi đã sau hai lớp (mô hình), một là lớp cơ sở và khác là phụ lớp:Làm thế nào để xác định xem thuộc tính thuộc lớp cơ sở hoặc lớp con động trong kiểu chung bằng cách sử dụng sự phản chiếu?

public class BaseClass 
{  
    public string BaseProperty{get;set;}  
} 

public class ChildClass: BaseClass  
{  
    public string ChildProperty{get;set;}  
} 

Trong ứng dụng tôi kêu gọi ChildClass động sử dụng Generics

List<string> propertyNames=new List<string>(); 
foreach (PropertyInfo info in typeof(T).GetProperties()) 
{ 
     propertyNames.Add(info.Name); 
} 

Ở đây, trong danh sách propertyNames, Tôi cũng nhận được tài sản cho BaseClass. Tôi chỉ muốn những tài sản đó thuộc lớp trẻ em. Điều này có thể không?

Tôi đã thử gì?

  1. Cố gắng loại bỏ nó như đã đề cập trong này question
  2. Cố gắng xác định liệu các lớp tiểu học hoặc lớp cơ sở như đã đề cập here nhưng điều đó không giúp được gì.
+3

Đẹp q. Tôi nghĩ rằng bạn có nghĩa là sử dụng Reflection mặc dù và không Generics? – StuartLC

+1

https://stackoverflow.com/questions/12667219/reflection-exclude-all-attributes-from-base-class-and-specific-attribute-from-al – Ric

Trả lời

9

Bạn có thể thử này

foreach (PropertyInfo info in typeof(T).GetProperties() 
     .Where(x=>x.DeclaringType == typeof(T))) // filtering by declaring type 
{ 
    propertyNames.Add(info.Name); 
} 
+0

Cảm ơn bạn đã làm việc như một nét duyên dáng :) Bạn tiết kiệm rất nhiều thời gian. –

1

Sử dụng một vòng lặp đơn giản để có được những tên thuộc lớp cơ sở

var type = typeof(T); 

var nameOfBaseType = "Object"; 

while (type.BaseType.Name != nameOfBaseType) 
{ 
    type = type.BaseType; 
} 

propertyNames.AddRange(type.GetProperties().Select(x => x.Name)) 
+0

Cảm ơn, nhưng tôi không muốn tên thuộc tính cơ sở. Tôi chỉ muốn các tên thuộc tính của lớp con. Ngoài ra, mọi thứ diễn ra tự động nên tôi có thể không mã hóa và gán biến 'nameofBaseType'. –

1

... Tôi muốn chỉ những thuộc tính đó là trong lớp trẻ . Điều này có thể không?

Bạn cần sử dụng quá tải GetProperties có tham số BindingFlags và bao gồm cờ BindingFlags.DeclaredOnly.

PropertyInfo[] infos = typeof(ChildClass).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); 

DeclaredOnly: Chỉ định rằng chỉ có các thành viên tuyên bố ở cấp độ của hệ thống phân cấp các loại cung cấp cần được xem xét. Các thành viên thừa kế không được xem xét.

+0

Cảm ơn, nhưng nó không trả lại bất kỳ tài sản nào. Tui bỏ lỡ điều gì vậy. Bạn kiểm tra [demo] này (http://rextester.com/MNAHMY33063) Tôi đã sử dụng mã của bạn. –

+1

@KaranDesai, bạn cần phải bao gồm ba BindingFlags tôi đã trình bày ở trên. Khi bạn gọi 'GetProperties' mà không chỉ định bất kỳ BindingFlags nào, nó sử dụng' BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance'. Vì vậy, bạn có thể muốn bao gồm 'BindingFlags.Static' vào danh sách; nó chỉ phụ thuộc vào những gì bạn muốn lấy và là lý do mà tôi cung cấp liên kết đến tài liệu BindingFlags. – TnTinMn

+0

Cảm ơn bạn đã làm rõ. Mô tả của DeclaredOnly làm tôi bối rối. Điều này cũng làm việc khi tôi thêm cả ba lá cờ. +1 –

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