Існує кілька сценаріїв, які слід враховувати. Перш за все, вам потрібно перевірити тип вашого об’єкта. Ви можете просто зателефонувати GetType () для цього. Якщо тип не реалізує IDynamicMetaObjectProvider, то ви можете використовувати відображення так само, як і для будь-якого іншого об'єкта. Щось на зразок:
var propertyInfo = test.GetType().GetProperties();
Однак для реалізацій IDynamicMetaObjectProvider просте відображення не працює. В основному вам потрібно більше знати про цей об’єкт. Якщо це ExpandoObject (який є однією з реалізацій IDynamicMetaObjectProvider), ви можете використовувати відповідь, надану itowlson. ExpandoObject зберігає його властивості у словнику, і ви можете просто віддати динамічний об’єкт до словника.
Якщо це DynamicObject (інша реалізація IDynamicMetaObjectProvider), то вам потрібно використовувати будь-які методи, які цей DynamicObject піддається. DynamicObject не потрібно "зберігати" свій список властивостей у будь-якому місці. Наприклад, це може зробити щось подібне (я повторно використовую приклад із своєї публікації в блозі ):
public class SampleObject : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = binder.Name;
return true;
}
}
У цьому випадку, коли ви намагаєтеся отримати доступ до властивості (з будь-яким даним іменем), об'єкт просто повертає ім'я властивості у вигляді рядка.
dynamic obj = new SampleObject();
Console.WriteLine(obj.SampleProperty);
//Prints "SampleProperty".
Отже, у вас немає нічого над цим відображати - цей об’єкт не має ніяких властивостей, і в той же час всі дійсні імена властивостей будуть працювати.
Я б сказав, що для реалізацій IDynamicMetaObjectProvider вам потрібно відфільтрувати відомі реалізації, де ви можете отримати список властивостей, таких як ExpandoObject, і проігнорувати (або викинути виняток) для решти.