2013-04-01 11 views
17

Mam klasy, która pochodzi od klasy abstrakcyjna. Uzyskiwanie typu klasy pochodnej Chcę dowiedzieć się, które właściwości są dziedziczone z klasy abstrakcyjnej i które zostały zadeklarowane w klasie pochodnej.Jak sprawdzić, czy właściwość jest dziedziczona z klasy bazowej lub zadeklarowana w pochodnej?

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" 
}; 

Tak, chciałbym, aby szybko dowiedzieć się, że CommonParam jest dziedziczną parametr i Id, Nazwa params są zadeklarowane w MsClass. Jakieś sugestie?

Próbowano użyć tylko zadeklarowane flagę zwraca Mnie bezowocne PropertyInfo tablicę

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

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

Jednak GetProperties() zwraca wszystkie właściwości hierarchii dziedziczenia.

type.GetProperties() 

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

Czy coś mi umknęło?

Odpowiedz

26

Można określić, aby uzyskać właściwości zdefiniowane w klasie pochodnej. Jeśli następnie wywołasz GetProperties na klasie bazowej, możesz uzyskać właściwości zdefiniowane w klasie bazowej.


W celu sprowadzenia publicznych właściwości ze swojej klasy, można zrobić:

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

W pewien sposób takie podejście nie daje oczekiwanego rezultatu. Pytanie zostało zaktualizowane. – Maxim

+2

@Maxim potrzebujesz 'type.GetProperties (BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public)'. +1 do Reeda, mam nadzieję, że zaktualizuje odpowiedź nieco. –

+0

@Maxim Dodano kod ... –

10

można sprawdzić na podstawie DeclaringType jak poniżej:

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

aby uzyskać właściwości z klasa podstawowa, którą możesz zadzwonić podobnie:

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

Może to pomóc:

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 Zdecydowanie działa, ale nie bardzo elegancko. Oczekiwano, że coś powinno już być wdrożone w celu obsługi wymaganego żądania. – Maxim

Powiązane problemy