По умолчанию DynamicObject скажет «отступление к отражению», если ваши функции Try * вернут false. Таким образом, вы уже можете наследовать и добавлять свойства / поля / методы в свой подкласс, которые будут обрабатываться отражением, если динамический путь не выполняет поиск.
Более подробно вы можете захотеть взглянуть на IDynamicMetaObjectProvider. На этом более низком уровне вы говорите, что откат к отражению - это вызов метода Fallback * для входящего DynamicMetaObjetBinder. Затем это позволяет языку вызова обеспечить разрешение. Затем вы можете вернуть этот AST или составить его в больший AST, который вы вернете. В основном Fallback * позволяет вам получить AST, который вызовет язык вызова, включая правильную ошибку (исключение, неопределенное в JS и т. Д.).
Способ, которым DynamicObject выполняет откат к отражению, заключается в том, что он фактически вызывает метод Fallback * переплета дважды. В первый раз он возвращается без параметра errorSuggestion. Получается либо ошибка, либо AST, построенный с использованием отражения. Затем он производит AST, который выглядит примерно так:
if(TryGetMember("name", out value)) {
return value;
} else {
return resultOffallback;
}
Затем он берет этот объединенный AST и фактически передает его в качестве предложения об ошибке для связующего при 2-м резерве. Связыватель должен затем соблюдать эту errorSuggestion, если привязка не удалась. Но если член .NET присутствует, то errorSuggestion выбрасывается, и привязка .NET имеет приоритет. И, наконец, если язык не знает, была ли привязка успешной (например, язык имеет функцию типа «метод отсутствует»), он может снова объединить AST с его динамическими проверками. Таким образом, используя Fallback, вы можете не только сказать «сделать отражение», но и выбрать, имеют ли динамический или статический член приоритет.