Esistono diversi scenari da considerare. Prima di tutto, devi controllare il tipo di oggetto. Puoi semplicemente chiamare GetType () per questo. Se il tipo non implementa IDynamicMetaObjectProvider, è possibile utilizzare la riflessione come per qualsiasi altro oggetto. Qualcosa di simile a:
var propertyInfo = test.GetType().GetProperties();
Tuttavia, per le implementazioni di IDynamicMetaObjectProvider, la semplice riflessione non funziona. Fondamentalmente, devi sapere di più su questo oggetto. Se si tratta di ExpandoObject (che è una delle implementazioni di IDynamicMetaObjectProvider), è possibile utilizzare la risposta fornita da itowlson. ExpandoObject memorizza le sue proprietà in un dizionario e puoi semplicemente trasmettere il tuo oggetto dinamico a un dizionario.
Se si tratta di DynamicObject (un'altra implementazione di IDynamicMetaObjectProvider), è necessario utilizzare tutti i metodi esposti da DynamicObject. DynamicObject non è necessario per "archiviare" effettivamente il suo elenco di proprietà ovunque. Ad esempio, potrebbe fare qualcosa del genere (sto riutilizzando un esempio dal mio post sul blog ):
public class SampleObject : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = binder.Name;
return true;
}
}
In questo caso, ogni volta che si tenta di accedere a una proprietà (con un determinato nome), l'oggetto restituisce semplicemente il nome della proprietà come stringa.
dynamic obj = new SampleObject();
Console.WriteLine(obj.SampleProperty);
//Prints "SampleProperty".
Quindi, non hai nulla su cui riflettere: questo oggetto non ha proprietà e allo stesso tempo tutti i nomi di proprietà validi funzioneranno.
Direi per le implementazioni di IDynamicMetaObjectProvider, è necessario filtrare le implementazioni note in cui è possibile ottenere un elenco di proprietà, come ExpandoObject, e ignorare (o generare un'eccezione) per il resto.