Определение ожидаемого типа доступа к элементу DynamicObject

Можно ли определить, какой тип ожидает доступ к динамическому члену? Я пробовал

dynamic foo = new MyDynamicObject();
int x = foo.IntValue;
int y = (int)foo.IntValue;

И в TryGetMember перехват GetMemberBinder.ReturnType является объектом в любом случае. Я также внедрил TryConvert, задаваясь вопросом, может ли он быть вызван для преобразования, но он никогда не попадает.

Есть ли какое-то другое переопределение, которое я пропускаю, что позволяет мне определить, какой тип вызывающего абонента хочет, чтобы я мог выполнить соответствующее преобразование?

Ответ 1

В С#, при использовании динамического, компилятор всегда устанавливает связующее, чтобы вернуть тип объекта, а затем выполняет второе динамическое неявное преобразование в ожидаемый тип возвращаемого значения. Таким образом, в DynamicObject при вызове из С#, GetMemberBinder.ReturnType всегда будет объектом, но при этом, если вы вернете другой тип динамического объекта с помощью TryConvert, вы можете получить этот тип, за исключением случаев, когда пользователь выполняет var or dynamic как переменную, то у них есть прокси-сервер, который ничего не сделает, пока не станет статически введенным.

ImpromptuInterface делает что-то другое, но в этом смысле, потому что у него также есть желание иметь динамическую реализацию, которая изменяется на основе типов возврата - просто вам придется описать динамический объект через интерфейс.