2013-03-15 14 views
6

voglio essere in grado di utilizzare la riflessione ciclo tramite le proprietà di un oggetto che non implementano un'interfacciautilizzando la riflessione di ottenere tutte le proprietà di un oggetto non implementato da un'interfaccia

Essenzialmente voglio raggiungere l'opposto di questo How do I use reflection to get properties explicitly implementing an interface?

Il motivo è che voglio associare oggetti a un altro oggetto in cui le proprietà che non sono definite da un'interfaccia vengono invece aggiunte a un elenco di KeyValuePairs.

+0

Nulla viene mai implementato * da * un'interfaccia. Vuoi dire che vuoi tutte le proprietà che * non * implementano un'interfaccia? –

+1

@MatthewWatson: nitpicking, ma: intendi chiedere all'OP se vuole che tutte le proprietà che _non partecipano_ in un'implementazione dell'interfaccia? – CodeCaster

+0

Siamo spiacenti. Sì ad entrambi sopra. –

risposta

6

Utilizzando questo esempio:

interface IFoo 
{ 
    string A { get; set; } 
} 
class Foo : IFoo 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
} 

Quindi, utilizzando questo codice, ottengo solo PropertyInfo per B.

var fooProps = typeof(Foo).GetProperties(); 
    var implementedProps = typeof(Foo).GetInterfaces().SelectMany(i => i.GetProperties()); 
    var onlyInFoo = fooProps.Select(prop => prop.Name).Except(implementedProps.Select(prop => prop.Name)).ToArray(); 
    var fooPropsFiltered = fooProps.Where(x => onlyInFoo.Contains(x.Name)); 
+0

Si presume che il nome della proprietà di implementazione corrisponda al nome della proprietà sull'interfaccia, il che non è necessariamente il caso. –

+0

@JonEgerton quindi sarebbe possibile che 'A' in' Foo' sia 'C', ad esempio? – LukeHennerley

+1

Questo è possibile in VB.Net, non sono sicuro di C#. Potrebbe non esserci un problema se l'OP può presumere che non stia lavorando con gli assembly VB.Net. –

Problemi correlati