2017-09-13 4 views
11

je suit deux classes (modèles), on est classe de base et d'autres est sous classe:Comment déterminer si la propriété appartient dynamiquement à la classe de base ou à la sous-classe dans un type générique en utilisant la réflexion?

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

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

En application, je fais appel ChildClass dynamiquement en utilisant des génériques

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

Ici, dans propertyNames liste, Je reçois aussi la propriété pour BaseClass. Je ne veux que les propriétés qui sont en classe enfant. Est-ce possible?

Qu'est-ce que j'ai essayé?

  1. J'ai essayé exclure comme mentionné dans ce question
  2. essayé de déterminer si la classe est sous classe ou classe de base comme mentionné here, mais cela ne suffit pas non plus.
+3

Nice q. Je pense que vous voulez dire utiliser Reflection et non génériques? – StuartLC

+1

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

Répondre

9

Vous pouvez essayer cette

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

Merci qui a fonctionné comme un charme :) Vous économisez mon lot de temps. –

1

En utilisant une simple boucle pour obtenir les noms de propriétés de classe de base

var type = typeof(T); 

var nameOfBaseType = "Object"; 

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

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

Merci, mais je ne veux pas de noms de propriété de classe de base. Je ne veux que les noms de propriété de classe enfant. De plus, tout se passe de façon dynamique, donc je ne pourrais pas coder en dur et affecter une variable 'nameofBaseType'. –

1

... Je veux que les propriétés qui sont en classe des enfants . Est-ce possible?

Vous devez utiliser la surcharge GetProperties qui prend un argument BindingFlags et comprennent le drapeau BindingFlags.DeclaredOnly.

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

DeclaredOnly: Indique que seuls les membres déclarés au niveau de la hiérarchie du type fourni doit être envisagée. Les membres hérités ne sont pas pris en compte.

+0

Merci, mais il ne me retourne aucune propriété. Est-ce que j'ai raté quelque chose? Vous vérifiez cela [démo] (http://rextester.com/MNAHMY33063) J'ai fait en utilisant votre code. –

+1

@KaranDesai, vous devez inclure les trois BindingFlags que j'ai montrés ci-dessus. Lorsque vous appelez 'GetProperties' sans spécifier aucun BindingFlags, il utilise' BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance'. Vous pouvez donc vouloir inclure 'BindingFlags.Static' à la liste; cela dépend de ce que vous voulez récupérer et c'est la raison pour laquelle j'ai fourni le lien vers la documentation de BindingFlags. – TnTinMn

+0

Merci pour la clarification. La description de DeclaredOnly m'a troublé. Cela a fonctionné aussi quand j'ai ajouté les trois drapeaux. +1 –