c# - method - En.NET, ¿puedes usar la reflexión para obtener todos los métodos no heredados de una clase?
create a class that inherits c# (4)
Al llamar al método "GetMembers" para obtener los miembros del Tipo, puede especificar "DeclaredOnly" en el indicador de enlace.
Debido a este problema here , estoy tratando de escribir un JsonConverter personalizado que maneje los casos en los que subclasifica una lista o una colección, y luego le agrega propiedades adicionales. Como tal, un enfoque sería ignorar todas las propiedades de clase base y solo serializar aquellas en la clase definida. (Técnicamente esto no funcionará porque si subclasifica esa subclase rompe la serialización, pero me hizo preguntarme ...)
¿Es posible a través de la reflexión (bueno, sé que la respuesta es ''sí'' porque Reflector hace exactamente eso, pero no sé cómo) para obtener solo los miembros que están definidos en la clase en lugar de los que fueron heredados? Por ejemplo...
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; }
}
En este caso, quiero reflexionar sobre MySubClass
y solo obtener SubProp1
y SubProp2
mientras se ignora BaseProp1
y BaseProp2
. Entonces , ¿ puede ser así cómo se hace?
METRO
Una gran cantidad de funciones de reflexión aceptan un parámetro de tipo BindingFlags . Esta enumeración incluye un valor DeclaredOnly:
Especifica que solo deben considerarse los miembros declarados en el nivel de la jerarquía del tipo suministrado. Los miembros heredados no son considerados.
MemberInfo.DeclaringType
debe hacer lo que necesita. Para obtener miembros definidos directamente en el tipo X, filtre los miembros por DeclaringType == typeof(X)
.
MySubClass
seleccionar todos los miembros en MySubClass
y conservar solo aquellos donde DeclaringType == MySubClass
.
Con LINQ, algo así (overkill):
MemberInfo[] notInherited = GetType("MySubClass").GetMembers().Where(m => m.DeclaringType == GetType("MySubClass"));
O con la sobrecarga GetMembers()
:
MemberInfo[] notInherited = GetType("MySubClass").GetMembers(BindingFlags.DeclaredOnly);