2010-01-25 18 views
14

Ho un'istanza di System.Type che rappresenta un'interfaccia e voglio ottenere un elenco di tutte le proprietà su quell'interfaccia, comprese quelle ereditate dalle interfacce di base. Fondamentalmente voglio lo stesso comportamento delle interfacce che ottengo per le classi.Riflette su tutte le proprietà di un'interfaccia, incluse quelle ereditate?

Ad esempio, dato questa gerarchia:

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"; } } 
} 

Se chiamo GetProperties sulla classe - typeof(Sub).GetProperties() - poi mi sia BaseProperty e sottoproprietà. Voglio fare la stessa cosa con l'interfaccia, ma quando lo provo - typeof(ISub).GetProperties() - tutto ciò che ritorna è SubProperty.

Ho provato a passare BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy a GetProperties, poiché la mia comprensione di FlattenHierarchy è che si suppone che includa membri di classi base, ma il comportamento era esattamente lo stesso.

Suppongo che potrei iterare Type.GetInterfaces() e chiamare GetProperties su ciascuno di essi, ma poi mi sarebbe affidamento su GetProperties su un'interfaccia per mai proprietà di base di ritorno (in quanto se mai lo ha fatto, mi piacerebbe ottenere i duplicati). Preferirei non fare affidamento su questo comportamento senza almeno vederlo documentato.

come posso neanche:

  • ottenere un elenco di tutte le proprietà su un'interfaccia, compresi quelli provenienti da sue interfacce di base? O
  • Almeno confida che quello che sto vedendo è un comportamento documentato su cui posso contare, quindi posso aggirarlo?
+1

possibile duplicato di [GetProperties() per restituire tutte le proprietà per una gerarchia di ereditarietà dell'interfaccia] (http://stackoverflow.com/questions/358835/getproperties-to-return-all-properties-for-an-interface-inheritance -lierarchia) – nawfal

risposta

7

Una risposta di sorta è di essere (cioè ottenere tutte le interfacce di applicazione.) trovato in un un'annotazione a the .NET framework version 3.5-specific MSDN page on GetProperties(BindingFlags bindingFlags):

Passando BindingFlags.FlattenHierarchy ad uno dei Typ I metodi e.GetXXX, come Type.GetMembers, non restituiscono i membri dell'interfaccia ereditati durante l'interrogazione su un'interfaccia .

[...]

Per ottenere i membri ereditati, è necessario per interrogare ogni interfaccia implementata per i suoi membri.

Il codice di esempio è anche incluso. Questo commento è stato pubblicato da una Microsoftie, quindi direi che puoi fidarti.

+0

La "community addition" che hai citato non viene mostrata per la versione corrente di quella pagina - devi tornare alla versione .Net Framework 3.5. Ecco un collegamento diretto: http://msdn.microsoft.com/en-us/library/kyaxdd3x%28v=vs.90% 29.aspx – RenniePet

+0

@RenniePet grazie, aggiornato – AakashM

Problemi correlati