Hay varios escenarios a considerar. En primer lugar, debe verificar el tipo de su objeto. Simplemente puede llamar a GetType () para esto. Si el tipo no implementa IDynamicMetaObjectProvider, puede usar la misma reflexión que para cualquier otro objeto. Algo como:
var propertyInfo = test.GetType().GetProperties();
Sin embargo, para las implementaciones de IDynamicMetaObjectProvider, la reflexión simple no funciona. Básicamente, necesita saber más sobre este objeto. Si es ExpandoObject (que es una de las implementaciones de IDynamicMetaObjectProvider), puede usar la respuesta proporcionada por itowlson. ExpandoObject almacena sus propiedades en un diccionario y simplemente puede convertir su objeto dinámico en un diccionario.
Si se trata de DynamicObject (otra implementación de IDynamicMetaObjectProvider), debe utilizar los métodos que expone este DynamicObject. DynamicObject no está obligado a "almacenar" su lista de propiedades en ninguna parte. Por ejemplo, podría hacer algo como esto (estoy reutilizando un ejemplo de mi publicación de blog ):
public class SampleObject : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = binder.Name;
return true;
}
}
En este caso, cada vez que intente acceder a una propiedad (con cualquier nombre), el objeto simplemente devuelve el nombre de la propiedad como una cadena.
dynamic obj = new SampleObject();
Console.WriteLine(obj.SampleProperty);
//Prints "SampleProperty".
Por lo tanto, no tiene nada sobre lo que reflexionar: este objeto no tiene ninguna propiedad y, al mismo tiempo, funcionarán todos los nombres de propiedad válidos.
Diría que para las implementaciones de IDynamicMetaObjectProvider, debe filtrar las implementaciones conocidas donde puede obtener una lista de propiedades, como ExpandoObject, e ignorar (o lanzar una excepción) para el resto.