Отражение на самом деле не работает (как и следовало ожидать) на dynamic
типах.Вам нужно проверить IDynamicMetaObjectProvider
, а затем использовать его методы, чтобы определить, доступен ли член для типа.
Проблема в том, что для типа dynamic
вполне приемлемодобавлять новых членов во время выполнения.Для примера см. ExpandoObject .Он только добавляет новые члены в операции над множествами, но вы также можете легко создать динамический тип, который всегда возвращает действительный член, независимо от того, что ему передано, например:
dynamic myType = new DynamicFoo();
Console.WriteLine(myType.Foo);
Console.WriteLine(myType.Bar);
Console.WriteLine(myType.Baz);
Это может бытьделается путем переопределения метода доступа get и просто делает их всегда действительными.В этом случае рефлексия не сможет сказать, что здесь сработает ...