Как я могу получить значения параметров вызывающего метода?

public static void main(String[] args) {
    double g = 1 / 3;
    System.out.printf("%.2f", g);
}

Поскольку как 1, так и 3 являются ints, результат не округлен, но он усечен. Таким образом, вы игнорируете фракции и выполняете только целые.

Чтобы избежать этого, по крайней мере одно из ваших чисел 1 или 3 как десятичная форма 1.0 и / или 3.0.

20
задан Chris Benard 29 January 2009 в 17:27
поделиться

4 ответа

Вы не можете сделать этого, не анализируя стек сами (и это хрупко, так как много оптимизации могут означать, что стековый фрейм не то, что Вы ожидаете, или даже что параметр передал, не на самом деле, что сигнатура метода предложила бы (для JIT-компилятора оптимизации совершенно возможно определить это, Вы только используете sub поле объекта/структуры и передачу это вместо этого).

ParameterInfo просто говорит Вам подпись метода, как скомпилировано, не значения, которые были переданы.

единственный реалистический способ достигнуть это автоматически через инжекцию кода (через что-то как AOP), чтобы создать данные и сделать то, что Вы хотите с ним на основе анализа IL.

Это обычно - не хорошая идея, если необходимо отладить что-то, используют отладчик, если необходимо зарегистрировать что-то быть явными о том, что Вы регистрируете.

, Чтобы быть ясными простыми отражающими методами не может достигать того, чего Вы требуете с полной общностью

17
ответ дан 30 November 2019 в 00:48
поделиться

Jonathan Keljo в Microsoft говорит, в это сообщение группы новостей :

, К сожалению, единственный простой способ получить информацию аргумента от стека вызовов сегодня с отладчиком. При попытке сделать это как часть регистрации ошибок в приложении, и Вы планируете передать журнал ошибок обратно своему отделу поддержки, мы надеемся сделать, чтобы Вы использовали мини-дампы с этой целью в будущем. (Сегодня, использование мини-дампа с управляемым кодом немного проблематично, поскольку это не включает достаточно информации для ровного получения отслеживания стека по умолчанию. Мини-дамп с "кучей" лучше, но не таким образом "мини-", если Вы понимаете, о чем я.)

, пурист А сказал бы, что разрешение людям написать код, который может получить аргументы от функций в другом месте на стеке вызовов, поощрило бы их повреждать инкапсуляцию и создавать код, это очень хрупко перед лицом изменения. (Ваш сценарий не имеет этой конкретной проблемы, но я услышал другие запросы на эту функцию, которая была бы. Так или иначе большинство тех запросов может быть решено другими способами, как использование хранилищ потока.) Однако, что еще более важно, были бы последствия безопасности этого - приложения, которые позволяют плагины, подвергся бы риску тех плагинов, очищающих стек для уязвимой информации. Мы могли, конечно, отметить функцию как требование полного доверия, но это сделает это неприменимым для в значительной степени каждого сценария, о котором я услышал.

Jonathan

Так... Я предполагаю, что короткий ответ, "Я не могу". Это сосет.

5
ответ дан 30 November 2019 в 00:48
поделиться

Вы не можете сделать этого или с StackFrame или с StackTrace. Можно, однако, использовать некоторую платформу перехвата (такую как материал AOP с Spring.NET) так, чтобы можно было овладеть значениями параметров.

1
ответ дан 30 November 2019 в 00:48
поделиться

Посмотрите здесь:

можно ли получить список переменных на стеке в C#?

я не думаю, что это - possbile, на основе всех комментариев к моему ответу там. Класс PropertyInfo действительно имеет метод GetValue, но это требует, чтобы у Вас был фактический объект, которого Вы хотите получить значение от.

0
ответ дан 30 November 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: