2011-05-04 15 views
14

Debido a este problema here, intento escribir un JsonConverter personalizado que maneje los casos en los que subclase una lista o una colección, y luego le agregue 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 subclases esa subclase, rompes la serialización, pero me hizo preguntarme ...)En .NET, ¿puedes usar el reflejo para obtener todos los métodos no heredados de una clase?

¿Es posible a través de la reflexión? Bueno, sé que la respuesta es 'sí' porque Reflector sí exactamente eso, pero no sé cómo) para obtener solo los miembros que se definen en la clase en sí mismos en oposición a los que se heredaron? 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 sólo conseguir SubProp1 y SubProp2 sin tener en cuenta BaseProp1 y BaseProp2. Entonces puede ser ¿cómo se hace?

M

Respuesta

17

Al llamar al método "GetMembers" para obtener los miembros del tipo, puede especificar "DeclaredOnly" en el marcador de enlace.

+0

¡Te di el voto a pesar de que @Damien_The_Unbeliever te ganó porque tiene una calificación de 17.5K y pensé que podrías usar el impulso! :) – MarqueIV

+0

Gracias hombre, ¿hay alguna manera de cobrar estos votos: D – Ankur

+0

pagarlo hacia adelante! :) Si alguna vez me ves ... ¡votame! – MarqueIV

2

Una gran cantidad de funciones 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.

+0

Ambos respondieron lo mismo, pero lo vencieron en un minuto así que tan pronto como SO me permita aceptar, se lo daré. :) – MarqueIV

+0

En realidad, no me mates, pero tienes 17,5 K y solo tiene 227, así que me gustaría darle un pequeño impulso. Espero que no te importe. (¡Tengo un número bajo yo mismo así que sé la sensación!) – MarqueIV

+0

@MarqueIV - no hay problema. Es el tipo de pregunta donde hay una carrera para obtener la respuesta antes que nadie. No me sorprendería que haya varias respuestas (casi idénticas) a esta pregunta que se eliminaron segundos después de haber sido enviadas. –

10

Debes seleccionar todos los miembros en MySubClass y guardar solo aquellos en DeclaringType == MySubClass.

Con LINQ, algo por el estilo (exageración):

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

O con GetMembers() sobrecarga:

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

Upvoted para las referencias de LINQ. ¡Gracias! – MarqueIV

1

MemberInfo.DeclaringType debe hacer lo que necesita. Para obtener miembros directamente definidos en el tipo X, filtre los miembros por DeclaringType == typeof(X).

+0

Thx esto es lo que necesitaba. Estaba usando BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly; pero de alguna manera, los métodos de Objetos heredados estaban llegando hasta que agregué su solución. Entonces noté que no era la primera solución de esta naturaleza que estaba usando. Para omitir los métodos de acceso a la propiedad get_XXX set_XXX, lo haría si (MethodInfo.SpecialName) continuara; – FocusedWolf

Cuestiones relacionadas