Należy wziąć pod uwagę kilka scenariuszy. Przede wszystkim musisz sprawdzić typ swojego obiektu. W tym celu możesz po prostu wywołać GetType (). Jeśli typ nie implementuje IDynamicMetaObjectProvider, możesz użyć odbicia takiego samego, jak w przypadku każdego innego obiektu. Coś jak:
var propertyInfo = test.GetType().GetProperties();
Jednak w przypadku implementacji IDynamicMetaObjectProvider prosta refleksja nie działa. Zasadniczo musisz wiedzieć więcej o tym obiekcie. Jeśli jest to ExpandoObject (który jest jedną z implementacji IDynamicMetaObjectProvider), możesz skorzystać z odpowiedzi udzielonej przez itowlson. ExpandoObject przechowuje swoje właściwości w słowniku i możesz po prostu przesłać swój obiekt dynamiczny do słownika.
Jeśli jest to DynamicObject (inna implementacja IDynamicMetaObjectProvider), musisz użyć wszelkich metod, które ujawnia ten DynamicObject. DynamicObject nie musi faktycznie „przechowywać” swojej listy właściwości w dowolnym miejscu. Na przykład może zrobić coś takiego (ponownie używam przykładu z mojego posta na blogu ):
public class SampleObject : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = binder.Name;
return true;
}
}
W tym przypadku, za każdym razem, gdy spróbujesz uzyskać dostęp do właściwości (o dowolnej nazwie), obiekt po prostu zwraca nazwę właściwości jako ciąg.
dynamic obj = new SampleObject();
Console.WriteLine(obj.SampleProperty);
Nie masz więc nad czym się zastanawiać - ten obiekt nie ma żadnych właściwości, a jednocześnie wszystkie prawidłowe nazwy właściwości będą działać.
Powiedziałbym, że w przypadku implementacji IDynamicMetaObjectProvider musisz przefiltrować znane implementacje, w których możesz uzyskać listę właściwości, takich jak ExpandoObject, i zignorować (lub wyrzucić wyjątek) dla reszty.