2010-01-25 20 views
14

Tengo una instancia de System.Type que representa una interfaz, y quiero obtener una lista de todas las propiedades en esa interfaz, incluidas las heredadas de las interfaces base. Básicamente quiero el mismo comportamiento de las interfaces que obtengo para las clases.¿Reflejando todas las propiedades de una interfaz, incluidas las heredadas?

Por ejemplo, dada esta jerarquía:

public interface IBase { 
    public string BaseProperty { get; } 
} 
public interface ISub : IBase { 
    public string SubProperty { get; } 
} 
public class Base : IBase { 
    public string BaseProperty { get { return "Base"; } } 
} 
public class Sub : Base, ISub { 
    public string SubProperty { get { return "Sub"; } } 
} 

Si llamo GetProperties en la clase - typeof(Sub).GetProperties() - entonces consigo tanto BaseProperty y subpropiedad. Quiero hacer lo mismo con la interfaz, pero cuando lo intento - typeof(ISub).GetProperties() - todo lo que vuelve es SubProperty.

Intenté pasar BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy a GetProperties, ya que mi comprensión de FlattenHierarchy es que se supone que debe incluir miembros de clases base, pero el comportamiento fue exactamente el mismo.

supongo que podría iterar Type.GetInterfaces() y llame GetProperties en cada uno, pero entonces estaría confiando en GetProperties en una interfaz de nunca propiedades básicas de retorno (ya que si es que alguna vez lo hizo, me gustaría obtener duplicados). Prefiero no confiar en este comportamiento sin al menos verlo documentado.

¿Cómo puedo ya sea:

  • obtener una lista de todas las propiedades de una interfaz, comprendidas las de sus interfaces base? O
  • Al menos tenga la seguridad de que lo que estoy viendo es un comportamiento documentado en el que puedo confiar, así que puedo evitarlo.
+1

posible duplicado de [GetProperties() para devolver todas las propiedades para una jerarquía de herencia de interfaz] (http://stackoverflow.com/questions/358835/getproperties-to-return-all-properties-for-an-interface-heriffitance -hierarchy) – nawfal

Respuesta

7

Un tipo de respuesta es ser (es decir, conseguir todas las interfaces de aplicación.) encontrado en un anotación a the .NET framework version 3.5-specific MSDN page on GetProperties(BindingFlags bindingFlags):

Pasando BindingFlags.FlattenHierarchy a uno de los Typ e.Métodos GetXXX, como Type.GetMembers, no devolverá miembros heredados de la interfaz cuando está consultando en una interfaz de tipo .

[...]

Para obtener los miembros heredados, es necesario para consultar cada interfaz implementada para sus miembros.

Código de ejemplo también incluido. Este comentario fue publicado por un Microsoft, así que diría que puedes confiar en él.

+0

La "adición a la comunidad" que menciona no se muestra para la versión actual de esa página; debe volver a la versión de .Net Framework 3.5. Aquí hay un enlace directo: http://msdn.microsoft.com/en-us/library/kyaxdd3x%28v=vs.90% 29.aspx – RenniePet

+0

@RenniePet gracias, actualizado – AakashM

Cuestiones relacionadas