Können Sie in .NET Reflection verwenden, um alle nicht vererbten Methoden einer Klasse abzurufen?
-
28-10-2019 - |
Frage
Aufgrund dieses Problems hier versuche ich, einen benutzerdefinierten JsonConverter zu schreibenBehandelt Fälle, in denen Sie eine Liste oder Sammlung unterordnen und dieser dann zusätzliche Eigenschaften hinzufügen.Ein Ansatz wäre daher, alle Eigenschaften der Basisklasse zu ignorieren und nur die in der definierten Klasse zu serialisieren.(Technisch funktioniert das nicht, denn wenn Sie diese Unterklasse unterordnen, brechen Sie die Serialisierung, aber ich habe mich gefragt ...)
Ist es möglich, über Reflexion (nun, ich weiß, die Antwort lautet "Ja", weil Reflector genau das tut, aber ich weiß nicht wie) nur die Mitglieder zu erhalten, die in der Klasse selbst definiert sind, im Gegensatz zu denen, die es warenvererbt?Zum Beispiel ...
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; }
}
In diesem Fall möchte ich über MySubClass
nachdenken und nur SubProp1
und SubProp2
erhalten, während BaseProp1
und BaseProp2
ignoriert werden.Also kann das sein, wie wird das gemacht?
M
Lösung
Während Sie die Methode "GetMembers" aufrufen, um die Mitglieder des Typs abzurufen, können Sie im Bindungsflag "DeclaredOnly" angeben.
Andere Tipps
Sie müssen alle Mitglieder in MySubClass
auswählen und nur diejenigen behalten, in denen DeclaringType == MySubClass
enthalten ist.
Mit LINQ so etwas (Overkill):
MemberInfo[] notInherited = GetType("MySubClass").GetMembers().Where(m => m.DeclaringType == GetType("MySubClass"));
Oder mit GetMembers()
-Überladung:
MemberInfo[] notInherited = GetType("MySubClass").GetMembers(BindingFlags.DeclaredOnly);
Viele Reflexionsfunktionen akzeptieren einen Parameter vom Typ BindingFlags .Diese Aufzählung enthält einen Wert DeclaredOnly:
Gibt an, dass nur Mitglieder berücksichtigt werden sollen, die auf der Ebene der Hierarchie des angegebenen Typs deklariert sind.Geerbte Mitglieder werden nicht berücksichtigt.
MemberInfo.DeclaringType
sollte genau das tun, was Sie benötigen.Um Mitglieder direkt in Typ X zu definieren, filtern Sie die Mitglieder nach DeclaringType == typeof(X)
.