C # Получение значения парм с использованием отражения
Как я могу получить значения парм (в цикле с использованием отражения). В предыдущем вопросе кто-то показал мне, как петля через пармы, используя reflection.
static void Main(string[] args) { ManyParms("a","b","c",10,20,true,"end"); Console.ReadLine(); } static void ManyParms(string a, string b, string c, int d, short e, bool f, string g) { var parameters = MethodBase.GetCurrentMethod().GetParameters(); foreach (ParameterInfo parameter in parameters) { string parmName = parameter.Name; Console.WriteLine(parmName); //Following idea required an object first //Type t = this.GetType(); //t.GetField(parmName).GetValue(theObject)); } }
Если вы должны знать, почему я хочу это сделать, см. Здесь: .NET Отражение всех параметров метода
Спасибо всем – похоже, в Python, PERL, PHP это было бы легко.
Хотя это может и не быть reflectionм, если я использую reflection для получения имени поля, кажется, что будет простой динамический способ получить значение на основе имени. Я еще не пробовал AOP (Aspect Oriented Programming) решения. Это одна из тех вещей, которые, если я не смогу сделать это через час или два, я, вероятно, этого не сделаю.
- Какая польза для тегов в Go?
- Как получить доступ к частным методам и частным данным через reflection?
- Как создать экземпляр произвольного типа массива во время выполнения?
- Получение имени параметра метода
- Как я могу оценивать выражение C # динамически?
- Почему TargetInvocationException рассматривается как неотображаемое средой IDE?
- Как узнать, является ли свойство автоматически реализованным свойством с reflectionм?
- Поиск различий свойств между двумя объектами C #
- Почему отраженный доступ к защищенному / частному члену classа в C #?
- Могу ли я использовать reflection для проверки кода в методе?
- Как перехватить вызов метода в C #?
- Любой способ вызвать частный метод?
- Обнаружить, если метод был переопределен с помощью Reflection (C #)
Вы не можете, в принципе – по крайней мере, не зацепившись за API-интерфейс отладчика / профилирования .
Теоретически может быть какой-то способ classа StackFrame
значения параметров, но это не так, и я подозреваю, что для этого вам придется удалить несколько оптимизаций.
Вы можете взломать этот путь, создав анонимный тип внутри вашего метода и воспользовавшись проекционными инициализаторами. Затем вы можете опросить свойства анонимного типа с помощью отражения. Например:
static void ManyParms( string a, string b, string c, int d, short e, bool f, string g) { var hack = new { a, b, c, d, e, f, g }; foreach (PropertyInfo pi in hack.GetType().GetProperties()) { Console.WriteLine("{0}: {1}", pi.Name, pi.GetValue(hack, null)); } }
Вы не можете через reflection, и вы не должны делать это в любом случае.
Если вам нужна такая функциональность, используйте прокси-сервер, например, через реализацию RealProxy, которая перехватывает вызов для вас. Затем вы можете проверить и изменить любой параметр до фактического вызова (или даже не выполнять оригинальный вызов вообще, это зависит от вас).
Вы не можете сделать это. Отражение работает с метаданными, внедренными во время компиляции, и в то время значения параметров неизвестны.
Рассматривали ли вы использование АОП, например PostSharp ?
Он может получить доступ к значениям аргументов до того, как ваш метод будет выполняться, и поэтому ваш код будет сведен к classу атрибутов многократного использования и атрибут, применяемый к методам, которые должны иметь эту проверку.
Вы не можете получить значение параметров метода с помощью отражения. Потому что reflection возвращает информацию метаданных. Если вы хотите получить значение определенного поля или свойства, вам нужно также использовать экземпляр (как вы уже знаете).
Существует несколько способов получить значение параметра, используя внутреннюю сантехнику платформы .NET, а именно API-интерфейс профилировщика и API-интерфейс отладчика.
Вы можете использовать AOP для того, что вы пытаетесь сделать, есть проект Codeplex под названием CThru, который может вам помочь – с помощью CThru вы можете перехватить метод при его вызове и получить параметры, с которыми он был вызван.
Инструментарий диагностики PostSharp поддерживает опцию IncludeParameterValue.
Если вы хотите получить более подробную информацию о создании мини-дампа,
см. Доступ к трассировке стека с помощью MDbgEngine и PADRE и создание настраиваемого аспекта PostSharp (с преобразованием IL)