Dans .NET, pouvez-vous utiliser la réflexion pour obtenir toutes les méthodes non héritées d'une classe?

StackOverflow https://stackoverflow.com/questions/5880819

Question

À cause de ce problème ici, J'essaie d'écrire un converteur JSON personnalisé qui gère les cas où vous sous-classez une liste ou une collection, puis ajoutez-y des propriétés supplémentaires. En tant que tel, une approche consisterait à ignorer toutes les propriétés de classe de base et à sérialiser uniquement celles de la classe définie. (Techniquement, cela ne fonctionnera pas parce que si vous sous-classez cette sous-classe, vous cassez la sérialisation, mais cela m'a fait me demander ...)

Est-il possible via la réflexion (eh bien je sais que la réponse est «oui» parce que le réflecteur fait exactement cela, mais je ne sais pas comment) pour obtenir uniquement les membres qui sont définis sur la classe elle-même par opposition à ceux qui ont été hérités? Par exemple...

public class MyBaseClass
{
    public string BaseProp1 { get; set; }
    public string BaseProp2 { get; set; }
}

public class MySubClass : MyBaseClass
{
    public string SubProp1 { get; set; }
    public string SubProp2 { get; set; }
}

Dans ce cas, je veux réfléchir MySubClass Et seulement SubProp1 et SubProp2 tout en ignorant BaseProp1 et BaseProp2. Alors peut-il être Comment est-ce fait?

M

Était-ce utile?

La solution

En appelant la méthode "getMembers" pour obtenir les membres du type, vous pouvez spécifier "Declatedonly" dans l'indicateur de liaison.

Autres conseils

Vous devez sélectionner tous les membres dans MySubClass Et ne gardez que ceux où DeclaringType == MySubClass.

Avec Linq, quelque chose comme ça (Overkill):

MemberInfo[] notInherited = GetType("MySubClass").GetMembers().Where(m => m.DeclaringType == GetType("MySubClass"));

Ou avec GetMembers() surcharge :

MemberInfo[] notInherited = GetType("MySubClass").GetMembers(BindingFlags.DeclaredOnly);

Beaucoup de fonctions de réflexion acceptent un paramètre de type Reliureflags. Cette énumération comprend une valeur déclarée:

Spécifie que seuls les membres déclarés au niveau de la hiérarchie du type fourni doivent être pris en considération. Les membres hérités ne sont pas pris en compte.

MemberInfo.DeclaringType devrait faire ce dont vous avez besoin. Pour que les membres soient directement définis dans le type X filtrent les membres par DeclaringType == typeof(X).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top