In .NET, puoi usare la reflection per ottenere tutti i metodi non ereditati di una classe?
-
28-10-2019 - |
Domanda
A causa di questo problema qui , sto cercando di scrivere un JsonConverter personalizzato chegestisce i casi in cui si crea una sottoclasse di un elenco o di una raccolta, quindi si aggiungono proprietà extra.Pertanto, un approccio sarebbe quello di ignorare tutte le proprietà della classe base e serializzare solo quelle nella classe definita.(Tecnicamente questo non funzionerà perché se si sottoclasse quella sottoclasse si interrompe la serializzazione, ma mi sono chiesto ...)
È possibile tramite la riflessione (beh, so che la risposta è 'sì' perché Reflector fa esattamente questo, ma non so come) ottenere solo i membri definiti nella classe stessa rispetto a quelli che eranoereditato?Ad esempio ...
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 questo caso, voglio riflettere su MySubClass
e ottenere solo SubProp1
e SubProp2
ignorando BaseProp1
e BaseProp2
.Quindi può essere come si fa?
M
Soluzione
Durante la chiamata al metodo "GetMembers" per ottenere i membri del Type, è possibile specificare "DeclaredOnly" nel flag di associazione.
Altri suggerimenti
Devi selezionare tutti i membri in MySubClass
e mantenere solo quelli in cui DeclaringType == MySubClass
.
Con LINQ, qualcosa del genere (eccessivo):
MemberInfo[] notInherited = GetType("MySubClass").GetMembers().Where(m => m.DeclaringType == GetType("MySubClass"));
O con sovraccarico GetMembers()
:
MemberInfo[] notInherited = GetType("MySubClass").GetMembers(BindingFlags.DeclaredOnly);
Molte funzioni di riflessione accettano un parametro di tipo BindingFlags .Questa enumerazione include un valore DeclaredOnly:
Specifica che devono essere considerati solo i membri dichiarati a livello della gerarchia del tipo fornito.I membri ereditati non vengono considerati.
MemberInfo.DeclaringType
dovrebbe fare ciò di cui hai bisogno.Per ottenere membri definiti direttamente nel tipo X, filtrare i membri per DeclaringType == typeof(X)
.