2017-09-13 84 views
11

Mam w następstwie dwóch klas (modele), jeden jest klasą bazową, a druga jest sub-klasę:Jak ustalić, czy właściwość należy do klasy podstawowej lub podklasy dynamicznie w typie ogólnym za pomocą odbicia?

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

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

W aplikacji Wołam ChildClass dynamicznie przy użyciu rodzajowych

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

Tutaj, w propertyNames listy Dostaję również własność dla BaseClass. Chcę tylko te nieruchomości, które są w klasie dzieci. czy to możliwe?

Co próbowałem?

  1. Próbował wyłączając go jak wspomniano w tym question
  2. Próbowaliśmy określenia, czy klasa jest sub klasy lub klasy bazowej jak wspomniano here ale to nie pomogło.
+3

Nice q. Myślę, że masz na myśli używanie Reflection, a nie Generics? – StuartLC

+1

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

Odpowiedz

9

Można spróbować tej

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

Dzięki, że zadziałało jak urok :) Uratowałeś mi dużo czas. –

1

Stosując prostą pętlę, aby uzyskać klasy bazowej nazwy właściwości

var type = typeof(T); 

var nameOfBaseType = "Object"; 

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

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

Dzięki, ale nie chcę nazw właściwości klasy podstawowej. Chcę tylko nazwy właściwości klasy potomnej. Ponadto, wszystko dzieje się dynamicznie, więc mogę nie kodować i przypisywać zmiennej 'nameofBaseType'. –

1

... Chcę tylko te właściwości, które są w klasie dziecka . czy to możliwe?

Trzeba użyć przeciążenie GetProperties że trwa BindingFlags argument i zawierać flagę BindingFlags.DeclaredOnly.

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

DeclaredOnly: Określa, że ​​tylko członkowie zadeklarowane na poziomie hierarchii dostarczoną TYP powinny być brane pod uwagę. Odziedziczeni członkowie nie są brani pod uwagę.

+0

Dzięki, ale nie zwraca mi żadnych właściwości. Czy czegoś brakuje? Sprawdzasz to [demo] (http://rextester.com/MNAHMY33063) zrobiłem używając twojego kodu. –

+1

@KaranDesai, musisz dołączyć trzy BindingFlags, które pokazałem powyżej. Kiedy wywołujesz 'GetProperties' bez określania żadnych BindingFlags, używa' BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance'. Więc możesz chcieć dołączyć 'BindingFlags.Static' do listy; zależy to tylko od tego, co chcesz odzyskać, i dlatego podałem link do dokumentacji BindingFlags. – TnTinMn

+0

Dzięki za wyjaśnienie. Opis DeclaredOnly mnie zmieszał. To też zadziałało, gdy dodałem wszystkie trzy flagi. +1 –